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

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

Это в 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 Ответ

0 голосов
/ 29 ноября 2011

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

- (void) viewDidLoad
{
    isHeadsetPluggedIn()
}

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

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

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

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

...