AV播放器音频路由到扬声器和耳机

时间:2012-01-18 02:20:04

标签: objective-c ios xcode

我正在尝试在插入耳机时将音频路由到耳机,并在没有连接耳机时通过iPhone扬声器播放。

我尝试了以下

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, nil); 

void audioRouteChangeListenerCallback (
                                       void                      *inUserData,
                                       AudioSessionPropertyID    inPropertyID,
                                       UInt32                    inPropertyValueSize,
                                       const void                *inPropertyValue
                                       ) {
    DetailViewController *controller = (__bridge_transfer DetailViewController *) inUserData;
    if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;

    CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;

    CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason) );
    SInt32 routeChangeReason;
    CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

    if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
        NSLog(@"UnPlugged");
[controller headphoneIsPlugged]; 
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride),&audioRouteOverride);
    } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {
        NSLog(@"Plugged in");
    }
}

根本没有调用功能耳机。该计划甚至没有进入该部分的那一部分。

现在,当我插上耳机时,音频停止播放,没有通过扬声器播放音频。

在audiolister内部,我试图提出以下内容 [controller.avplayer play]; 但仍然没有发生任何事情。

请帮忙

1 个答案:

答案 0 :(得分:0)

添加侦听器时,需要传递DetailViewController的实例。这将作为用户数据传递。没有这个(__bridge_transfer DetailViewController *) inUserData;将返回nil。

如果您在DetailViewController

中拨打电话,您的代码就是这样的
AudioSessionAddPropertyListener (
   kAudioSessionProperty_AudioRouteChange,
   audioRouteChangeListenerCallback,
   (__bridge void *)(self)
);