获取音频路径会给出空字符串

时间:2011-05-27 17:28:35

标签: iphone objective-c audio

我目前正在使用一段代码来检测用户是否已使用iPhone插入/拔出耳机。我用来检测它的方法如下所示。

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

    CFStringRef route; UInt32 routeSize = sizeof(CFStringRef);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute,&routeSize, &route);
    NSString *oldroute = (NSString*)route;
    NSLog(@"Audio Route changed to: %@",oldroute);
}

当我拔下耳机时,我的问题出现了。将它们插入工作正如我所期望的那样,日志文件显示“音频路由改为:耳机”,然而,当我拔下插头时,我得到了oldroute的空字符串。我希望这个值会像Apple文档中所说的那样“扬声器”。谁看过这个吗?我在获取字符串oldroute时做错了什么?感谢

2 个答案:

答案 0 :(得分:1)

对于我发布的问题,我仍然没有找到一个好的答案。这是一个可能适用于有类似问题的人的解决方法。此解决方案为您提供更改前处于活动状态的路径。防爆。如果你拔掉你的耳机,你会得到一个“耳机”字符串,或者如果你戴上耳机,你会得到一个“扬声器”的字符串。

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

    CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;
    CFStringRef oroute;
    oroute = (CFStringRef)CFDictionaryGetValue(routeChangeDictionary,   CFSTR(kAudioSession_AudioRouteChangeKey_OldRoute));
    NSString *oldroute = (NSString*)oroute;
}

希望这有帮助。

编辑:我会接受我的答案,直到有更好的答案出现

答案 1 :(得分:0)

我目前使用以下内容:

void _propertyListener( void *                  inClientData,
                   AudioSessionPropertyID   inID,
                   UInt32                  inDataSize,
                   const void *            inData) {

if (inID != kAudioSessionProperty_AudioRouteChange) {
    return;
}
dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kAudioRouteChanged object:nil];
});

}

- (void) _audioRouteChanged:(NSNotification*)notification
{

    NSLog(@"audioRouteChanged");

    UInt32 routeSize = sizeof (CFStringRef);
    CFStringRef route;

    OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &routeSize, &route);

    /* Known values of route:
     * "Headset"
     * "Headphone"
     * "Speaker"
     * "SpeakerAndMicrophone"
     * "HeadphonesAndMicrophone"
     * "HeadsetInOut"
     * "ReceiverAndMicrophone"
     * "Lineout"
     */

    if (!error && (route != NULL)) {

        NSString* routeStr = (__bridge NSString*)route;

        NSRange headphoneRange = [routeStr rangeOfString : @"Head"];

        [self.cardSwipeDelegate headphoneListener:(headphoneRange.location != NSNotFound)];

        if (headphoneRange.location != NSNotFound) {
            [self startSession];
        } else {
            [self stopSession];
        }
    }
}

无论您在哪里进行初始化,都要添加通知:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(_audioRouteChanged:) name:kAudioRouteChanged object:nil];