Получение аудио маршрута дает пустую строку - PullRequest
1 голос
/ 27 мая 2011

В настоящее время я работаю с фрагментом кода, чтобы определить, подключил ли пользователь / отключил наушники от своего 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.Я надеялся, что это значение будет «Speaker», как говорится в документах Apple.Кто-нибудь видел это раньше?Я делаю что-то не так в получении строки oldroute?Спасибо

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Я до сих пор не нашел хорошего ответа на вопрос, который я опубликовал в качестве вопроса. Вот обходной путь, который может работать для некоторых людей с подобной проблемой. Это решение дает вам маршрут, который был активен до изменения. Ex. если вы отключите наушники, вы получите строку «Наушники», или если вы вставите наушники, вы получите строку «Динамик».

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;
}

Надеюсь, это поможет.

Редактировать: я собираюсь принять мой ответ, пока не придет лучший

0 голосов
/ 05 апреля 2012

В настоящее время я использую следующее:

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...