Как определить источник записи звука - PullRequest
0 голосов
/ 25 мая 2011

Во время записи звука с помощью приложения для iPad как узнать, является ли источник звука встроенным микрофоном или микрофоном для наушников?

Дополнительная информация: iOS версии 4.2 и выше.

1 Ответ

0 голосов
/ 25 мая 2011

Способ определить это - опросить аппаратное обеспечение и запросить текущий маршрут аудио.

Используйте объект AudioSessionGetProperty , чтобы получить маршрут аудио.* Этот пример @ TPoschel должен поставить вас на правильный путь.

- (void)playSound:(id) sender
{
    if(player){

        CFStringRef route;
        UInt32 propertySize = sizeof(CFStringRef);
        AudioSessionInitialize(NULL, NULL, NULL, NULL);
        AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route);

        if((route == NULL) || (CFStringGetLength(route) == 0)){
            // Silent Mode
            NSLog(@"AudioRoute: SILENT");
        } else {
            NSString* routeStr = (NSString*)route;
            NSLog(@"AudioRoute: %@", routeStr);

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

            NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"];
            NSRange headsetRange = [routeStr rangeOfString : @"Headset"];
            NSRange receiverRange = [routeStr rangeOfString : @"Receiver"];
            NSRange speakerRange = [routeStr rangeOfString : @"Speaker"];
            NSRange lineoutRange = [routeStr rangeOfString : @"Lineout"];

            if (headphoneRange.location != NSNotFound) {
                // Don't change the route if the headphone is plugged in.
            } else if(headsetRange.location != NSNotFound) {
                // Don't change the route if the headset is plugged in.
            } else if (receiverRange.location != NSNotFound) {
                // Change to play on the speaker
                UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
                AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
            } else if (speakerRange.location != NSNotFound) {
                // Don't change the route if the speaker is currently playing.
            } else if (lineoutRange.location != NSNotFound) {
                // Don't change the route if the lineout is plugged in.
            } else {
                NSLog(@"Unknown audio route.");
            }
        }

        [player play];
    }
}
...