Информация о том, когда наушники подключены к разъему 3,5 мм, работает, только если они не были подключены до запуска приложения

Я получил этот код, чтобы сказать, если наушники подключены или нет:

Это в viewDidLoad:

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioSessionPropertyListener, nil);

Эта функция:

void audioSessionPropertyListener(void* inClientData, AudioSessionPropertyID inID,
                              UInt32 inDataSize, const void* inData) {
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

// Determines the reason for the route change, to ensure that it is not
//      because of a category change.
CFDictionaryRef routeChangeDictionary = inData;    
CFNumberRef routeChangeReasonRef = CFDictionaryGetValue (routeChangeDictionary,CFSTR (kAudioSession_AudioRouteChangeKey_Reason));

SInt32 routeChangeReason;    
CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

// "Old device unavailable" indicates that a headset was unplugged, or that the
//  device was removed from a dock connector that supports audio output. 
if (routeChangeReason != kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
    [[Cubic_01AppDelegate sharedInstance] setDongleIsDisonnected];
}


if (!isHeadsetPluggedIn()) 
{
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
}
else 
{
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
}    

}

и эта функция:

BOOL isHeadsetPluggedIn() {
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;

OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                          &routeSize,
                                          &route
                                          );    
NSLog(@"%@", route);

BOOL isPluggedIn = !error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound);

if (isPluggedIn) {
    [[Cubic_01AppDelegate sharedInstance] setDongleIsConnected];
} else {
    [[Cubic_01AppDelegate sharedInstance] setDongleIsDisonnected];
}

return (isPluggedIn);

}

Может ли кто-нибудь помочь с сообщением, почему функция audioSessionPropertyListener не вызывается, когда наушники уже подключены до запуска приложения?

1 ответ

Вам необходимо предоставить чек на загрузку / запуск приложения. В основном вы должны быть в состоянии позвонить:

- (void) viewDidLoad
{
    isHeadsetPluggedIn()
}

Слушатель свойства не был установлен, если вы не запустили свое приложение до подключения наушников. Обратите внимание, что слушатель свойства проверяет только изменения.

Так что вам нужно будет предоставить проверку на загрузку / запуск приложения. Вы можете получить свойства AudioSession напрямую, не используя прослушиватель и, следовательно, анализировать. И это именно то, что вы делаете в isHeadsetPluggedIn() при вызове:

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

Этот метод может быть вызван в целевых функциях c и C++. Он может быть вызван в любом месте, чтобы получить любое свойство AudioSession после его инициализации.

Другие вопросы по тегам