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

152 lines
4.2 KiB
Mathematica
Raw Normal View History

2017-01-13 06:58:52 +00:00
/* 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