1

iPhoneアプリ出力用のオーディオルーティングを設定しようとしています。ルート変更リスナーを使用して、オーディオ ルートがいつ変更されたかを検出しています。リスナーは、ヘッドフォンが差し込まれたり外されたりしたときなどの変化を検出します。デフォルトでは、スピーカーはオーディオを再生し、ヘッドフォンを接続すると、オーディオはヘッドフォンを介して正常に送信されます。そこから、ルート変更リスナーが変更を検出していても、変更は発生しません。

どんな助けでも本当に感謝しています。

NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord
                                       error:&sessionError];
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),
                        &sessionCategory);
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
                        sizeof(sessionCategory), &sessionCategory);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                            RouteChangeListener, (__bridge void *)(self));
AudioSessionSetActive(YES);

コールバック リスナー:

void RouteChangeListener(
                         void                      *inUserData,
                         AudioSessionPropertyID    inPropertyID,
                         UInt32                    inPropertyValueSize,
                         const void                *inPropertyValue)
{
    if (inPropertyID == kAudioSessionProperty_AudioRouteChange) {
        CFStringRef newRoute;
        UInt32 size = sizeof(CFStringRef);
        AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute);
        if (newRoute) {
            CFShow(newRoute);
            if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"),
                                (UInt32)NULL) == kCFCompareEqualTo) {
                UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
                AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                                         sizeof(audioRouteOverride), &audioRouteOverride);
            } else if (CFStringCompare(newRoute, CFSTR("HeadphonesAndMicrophone"),
                                       (UInt32)NULL) == kCFCompareEqualTo) {
                UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
                AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                                         sizeof(audioRouteOverride), &audioRouteOverride);
                    [[[AVAudioSession sharedInstance] player] play];
            }
        }
    }
}
4

0 に答える 0