libs/vorbis-tremor-ios/vorbis/PASoundMgr.m

152 lines
4.2 KiB
Objective-C
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* cocos2d for iPhone
*
* http://www.cocos2d-iphone.org
*
* Copyright (C) 2009 by Florin Dumitrescu.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the 'cocos2d for iPhone' license.
*
* You will find a copy of this license within the cocos2d for iPhone
* distribution inside the "LICENSE" file.
*
*/
#import "PASoundMgr.h"
#import "MyOpenALSupport.h"
#import "PASoundListener.h"
#import "PASoundSource.h"
@implementation PASoundMgr
@synthesize listener, soundsMasterGain;
static PASoundMgr *sharedSoundManager = nil;
+ (PASoundMgr *)sharedSoundManager {
@synchronized(self) {
if (!sharedSoundManager){
sharedSoundManager = [[PASoundMgr alloc] init];
}
return sharedSoundManager;
}
// to avoid compiler warning
return nil;
}
+ (id)alloc {
@synchronized(self)
{
NSAssert(sharedSoundManager == nil, @"Attempted to allocate a second instance of a singleton.");
sharedSoundManager = [super alloc];
return sharedSoundManager;
}
// to avoid compiler warning
return nil;
}
- (id)init {
if ((self = [super init])) {
sounds = [[NSMutableDictionary alloc] initWithCapacity:3];
soundsMasterGain = 1.0f;
// setup our audio session
OSStatus result = AudioSessionInitialize(NULL, NULL, NULL, self);
if (result) printf("Error initializing audio session! %d\n", (int)result);
else {
UInt32 category = kAudioSessionCategory_AmbientSound;
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
if (result) printf("Error setting audio session category! %d\n", (int)result);
else {
result = AudioSessionSetActive(true);
if (result) printf("Error setting audio session active! %d\n", (int)result);
}
}
// Initialize our OpenAL environment
[self initOpenAL];
}
return self;
}
- (void)initOpenAL {
ALCcontext *newContext = NULL;
ALCdevice *newDevice = NULL;
// Create a new OpenAL Device
// Pass NULL to specify the systems default output device
newDevice = alcOpenDevice(NULL);
if (newDevice != NULL) {
// Create a new OpenAL Context
// The new context will render to the OpenAL Device just created
newContext = alcCreateContext(newDevice, 0);
if (newContext != NULL) {
// Make the new context the Current OpenAL Context
alcMakeContextCurrent(newContext);
}
}
atexit(TeardownOpenAL);
alGetError();
[self initListener];
}
- (void)initListener {
listener = [[PASoundListener alloc] init];
}
- (PASoundSource *)addSound:(NSString *)name withExtension:(NSString *)ext position:(CGPoint)pos looped:(BOOL)yn {
PASoundSource *sound = [[PASoundSource alloc] initWithPosition:pos file:name extension:ext looped:yn];
if (sound) {
[sounds setObject:sound forKey:[NSString stringWithFormat:@"%@.%@",name,ext]];
[sound release];
}
return sound;
}
- (PASoundSource *)addSound:(NSString *)name withPosition:(CGPoint)pos looped:(BOOL)yn {
return [self addSound:name withExtension:@"wav" position:pos looped:yn];
}
- (PASoundSource *)sound:(NSString *)name withExtension:(NSString *)ext {
NSString *key = [NSString stringWithFormat:@"%@.%@",name,ext];
if ([[sounds allKeys] containsObject:key]) {
return [sounds objectForKey:key];
}
return nil;
}
- (PASoundSource *)sound:(NSString *)name {
return [self sound:name withExtension:@"wav"];
}
- (BOOL)play:(NSString *)name withExtension:(NSString *)ext {
PASoundSource *sound = [self sound:name withExtension:ext];
if (sound) {
[sound playAtListenerPosition];
return YES;
}
return NO;
}
- (BOOL)play:(NSString *)name {
return [self play:name withExtension:@"wav"];
}
- (BOOL)stop:(NSString *)name withExtension:(NSString *)ext {
PASoundSource *sound = [self sound:name withExtension:ext];
if (sound) {
[sound stop];
return YES;
}
return NO;
}
- (BOOL)stop:(NSString *)name {
return [self stop:name withExtension:@"wav"];
}
- (void)dealloc {
[sounds release];
[listener release];
[super dealloc];
}
@end