AudioServicesで音制御できない

2012/05/30

AudioServicesCreateSystemSoundID を利用して短い音を再生するのは良いのですが、

ネットワーク通信するとボリュームボタンで制御できない

事が判明

たちの悪い事に、adMobを利用するだけでダメです。 と言う事で、短い音を再生するには OpenALが一番手っ取り早いかと。

AVAudioPlayerはBGM鳴らすのはいいのですが、効果音のように連続で音をならすようなモノはちょっと不向きです。

--2012/06/08追記 OpenALは、AdMobとかで処理が割り込まれた場合、オーディオが止まることがあります。 以下の対処でいいらしい。 restarting openAL after application interruption on the iPhone

AudioSessionInitialize で interruptionListener を設定し、割り込みがあった時に OpenAL を Suspendしてやる感じだそうです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self loadALC];

    OSStatus result = AudioSessionInitialize(NULL, NULL, interruptionListener, (__bridge void*) self);
    NSLog(@"result %@", result);

    return YES;
}

- (void)loadALC {
    UInt32 category = kAudioSessionCategory_AmbientSound;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (category), &category);
    AudioSessionSetActive(YES);
    
    ALCdevice*  device;
    ALCcontext* alContext = alcGetCurrentContext();
    if (alContext == nil) {
        device = alcOpenDevice(NULL);
        alContext = alcCreateContext(device, NULL);
        alcMakeContextCurrent(alContext);
    }
}

void interruptionListener(void *inUserData, UInt32 inInterruption) {
    if (inInterruption == kAudioSessionBeginInterruption) {
        printf("BeginInterruption\n");
        ALCcontext* alContext = alcGetCurrentContext();
        alcMakeContextCurrent(NULL);
        alcSuspendContext(alContext); 
    }
    if (inInterruption == kAudioSessionEndInterruption) {
        printf("EndInterruption\n");
        UInt32 category = kAudioSessionCategory_AmbientSound;
        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
        ALCcontext* alContext = alcGetCurrentContext();
        alcMakeContextCurrent(alContext);
        alcProcessContext(alContext);
    }
}