Технические вопросы и ответы QA1799

AVAudioSession - Выбор микрофона

Q: Как я могу выбрать определенный встроенный микрофон при записи?

A: iOS 6 автоматически выбирает выбор встроенного микрофона (на устройствах, имеющих два или больше встроенных микрофона) с помощью аудио режимов сеанса. Режимы влияют на возможные маршруты и цифровую обработку сигналов, используемую для ввода. Важно отметить, что они оптимизированы для варианта использования, указанного каждым режимом, и установка режима может также влиять на другие аспекты используемого маршрута. Например, при записи параметра видео AVAudioSessionModeVideoRecording аудио режим сеанса выберет «лучший» микрофон вместо «нижнего» микрофона по умолчанию на iPhone 4/4S, и на iPhone 5 «передние» и «задние» микрофоны будут использоваться для обеспечения направленного шумоподавления посредством обработки формирования луча.

iOS 7 предлагает разработчикам больше гибкости с точки зрения выбора определенных встроенных микрофонов.

Используя APIs, представленный в iOS 7, разработчики могут выполнить задачи, такие как определение местоположения описания порта, представляющего встроенный микрофон, определяя местоположение определенных микрофонов как «передняя сторона», «назад» или «нижняя часть», устанавливая Ваш выбор микрофона как предпочтительный источник данных, устанавливая встроенный порт микрофона как предпочтительный ввод и даже выбирая предпочтительную диаграмму направленности микрофона если поддержка оборудования это. Посмотрите AVAudioSession.h.

Сводка API - предпочтительные вводы, выбор микрофона и конфигурация

Свойство availableInputs

Для обнаружения, какие входные порты соединяются (или встроенный) используют AVAudioSession свойство availableInputs. Это свойство возвращается NSArray из AVAudioSessionPortDescription объекты.

/* Get the set of input ports that are available for routing. Note that this property only applies to the session's current category and mode.
   For example, if the session's current category is AVAudioSessionCategoryPlayback, there will be no available inputs. */
 
@property(readonly) NSArray * availableInputs NS_AVAILABLE_IOS(7_0); /* NSArray of AVAudioSessionPortDescription objects. */

setPreferredInput:error: Метод

Порты (AVAudioSessionPortDescription объекты), может быть идентифицирован их portType свойство, например AVAudioSessionPortBuiltInMic, AVAudioSessionPortHeadsetMic и т.д. Посмотрите AVAudioSession.h для получения дальнейшей информации.

Для установки предпочтительного входного порта (встроенный микрометр, соединенный проводом микрометр, ввод USB, и т.д.) используют AVAudioSession setPreferredInput:error: метод. Этот метод берет a AVAudioSessionPortDescription объект.

/* Select a preferred input port for audio routing. If the input port is already part of the current audio route, this will have no effect.
   Otherwise, selecting an input port for routing will initiate a route change to use the preferred input port, provided that the application's
   session controls audio routing. */
 
- (BOOL) setPreferredInput:(AVAudioSessionPortDescription*)inPort error:(NSError **)outError NS_AVAILABLE_IOS(7_0);

Свойство источников данных

Для портов, поддерживающих источники данных (встроенный микрофон, некоторые аксессуары USB), приложения могут обнаружить то, что источники данных доступны путем запросов AVAudioSessionPortDescription dataSources свойство. В случае «встроенного микрофона», возвращенное описание представляет каждый отдельный микрофон. Различные устройства возвратят различную информацию об источнике данных. IPhone 4 и 4S имеет два микрофона; «нижняя часть» и «вершина». IPhone 5 имеет 3 микрофона; «нижняя часть», «передняя сторона», и «назад».

/* Array of AVAudioSessionDataSourceDescription objects. Will be nil if there are no selectable data sources. */
 
@property(readonly) NSArray *	dataSources NS_AVAILABLE_IOS(7_0);

Отдельные встроенные микрофоны могут быть идентифицированы комбинацией a AVAudioSessionDataSourceDescription location свойство (AVAudioSessionLocationUpper, AVAudioSessionLocationLower) и orientation свойство (AVAudioSessionOrientationTop, AVAudioSessionOrientationFront и т.д.). См. AVAudioSession.h для получения дальнейшей информации.

setPreferredDataSource:error: Метод

Приложения могут установить предпочтительный источник данных при помощи setPreferredDataSource:error: метод a AVAudioSessionPortDescription объект. Этот метод берет a AVAudioSessionDataSourceDescription объект.

/* Select the preferred data source for this port. The input dataSource parameter must be one of the dataSources exposed by the dataSources property.
Note: if the port is part of the active audio route, changing the data source will likely
result in a route reconfiguration. If the port is not part of the active route, selecting a new data source will
not result in an immediate route reconfiguration. Use AVAudioSession's setPreferredInput:error: method to activate the port. */
 
- (BOOL) setPreferredDataSource:(AVAudioSessionDataSourceDescription *)dataSource error:(NSError **)outError NS_AVAILABLE_IOS(7_0);

Свойство supportedPolarPatterns

Некоторая поддержка устройств на iOS, добирающаяся и устанавливающая диаграммы направленности микрофона для некоторых встроенных микрофонов. Поддержки iPhone 5, устанавливающие предпочтительную диаграмму направленности для «передней стороны» и «назад» встроенных микрофонов. Доступные образцы возвращаются с помощью supportedPolarPatterns свойство a AVAudioSessionDataSourceDescription. Это свойство или возвратит массив поддерживаемых диаграмм направленности для источника данных, например AVAudioSessionPolarPatternCardioid, AVAudioSessionPolarPatternOmnidirectional и т.д., или nil когда никакие выбираемые образцы не доступны.

/* Array of one or more NSStrings describing the supported polar patterns for a data source. Will be nil for data sources that have no selectable patterns. */
 
@property(readonly) NSArray *	supportedPolarPatterns NS_AVAILABLE_IOS(7_0);

setPreferredPolarPattern:error: Метод

Если источник данных имеет много поддерживаемых полярных скороговорок, можно установить предпочтительную диаграмму направленности при помощи AVAudioSessionDataSourceDescription setPreferredPolarPattern:error: метод.

/* Select the desired polar pattern from the set of available patterns. Note: if the owning port and data source are part of the active audio route,
   changing the polar pattern will likely result in a route reconfiguration. If the owning port and data source are not part of the active route,
   selecting a polar pattern will not result in an immediate route reconfiguration. Use AVAudioSession's setPreferredInput:error: method
   to activate the port. Use setPreferredDataSource:error: to active the data source on the port. */
 
- (BOOL) setPreferredPolarPattern:(NSString *)pattern error:(NSError **)outError NS_AVAILABLE_IOS(7_0);

Перечисление 1 демонстрирует, как приложения могут найти AVAudioSessionPortDescription это представляет встроенный микрофон, найдите передний микрофон (на iPhone 5 или другом устройстве, имеющем передний микрофон направления), установите передний микрофон как предпочтительный источник данных и установите встроенный порт микрофона как предпочтительный ввод.

Перечисление 1  демонстрирует входной выбор.

#import <AVFoundation/AVAudioSession.h>
 
- (void) demonstrateInputSelection
{
    NSError* theError = nil;
    BOOL result = YES;
 
    AVAudioSession* myAudioSession = [AVAudioSession sharedInstance];
 
    result = [myAudioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&theError];
    if (!result)
    {
        NSLog(@"setCategory failed");
    }
 
    result = [myAudioSession setActive:YES error:&theError];
    if (!result)
    {
        NSLog(@"setActive failed");
    }
 
    // Get the set of available inputs. If there are no audio accessories attached, there will be
    // only one available input -- the built in microphone.
    NSArray* inputs = [myAudioSession availableInputs];
 
    // Locate the Port corresponding to the built-in microphone.
    AVAudioSessionPortDescription* builtInMicPort = nil;
    for (AVAudioSessionPortDescription* port in inputs)
    {
        if ([port.portType isEqualToString:AVAudioSessionPortBuiltInMic])
        {
            builtInMicPort = port;
            break;
        }
    }
 
    // Print out a description of the data sources for the built-in microphone
    NSLog(@"There are %u data sources for port :\"%@\"", (unsigned)[builtInMicPort.dataSources count], builtInMicPort);
    NSLog(@"%@", builtInMicPort.dataSources);
 
    // loop over the built-in mic's data sources and attempt to locate the front microphone
    AVAudioSessionDataSourceDescription* frontDataSource = nil;
    for (AVAudioSessionDataSourceDescription* source in builtInMicPort.dataSources)
    {
        if ([source.orientation isEqual:AVAudioSessionOrientationFront])
        {
            frontDataSource = source;
            break;
        }
    } // end data source iteration
 
    if (frontDataSource)
    {
        NSLog(@"Currently selected source is \"%@\" for port \"%@\"", builtInMicPort.selectedDataSource.dataSourceName, builtInMicPort.portName);
        NSLog(@"Attempting to select source \"%@\" on port \"%@\"", frontDataSource, builtInMicPort.portName);
 
        // Set a preference for the front data source.
        theError = nil;
        result = [builtInMicPort setPreferredDataSource:frontDataSource error:&theError];
        if (!result)
        {
            // an error occurred. Handle it!
            NSLog(@"setPreferredDataSource failed");
        }
    }
 
    // Make sure the built-in mic is selected for input. This will be a no-op if the built-in mic is
    // already the current input Port.
    theError = nil;
    result = [myAudioSession setPreferredInput:builtInMicPort error:&theError];
    if (!result)
    {
        // an error occurred. Handle it!
        NSLog(@"setPreferredInput failed");
    }
 
}

Перечисление 1 произведет следующий консольный вывод, когда работается iPhone 5:

There are 3 data sources for port :"<AVAudioSessionPortDescription: 0x14d935a0, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Bottom>"
(
    "<AVAudioSessionDataSourceDescription: 0x14d93800, ID = 1835216945; name = Bottom>",
    "<AVAudioSessionDataSourceDescription: 0x14d938d0, ID = 1835216946; name = Front>",
    "<AVAudioSessionDataSourceDescription: 0x14d93a10, ID = 1835216947; name = Back>"
)
Currently selected source is "Bottom" for port "iPhone Microphone"
Attempting to select source "<AVAudioSessionDataSourceDescription: 0x14d938d0, ID = 1835216946; name = Front>" on port "iPhone Microphone”

Для изменения выходной стороны аудио маршрута приложения могут включать a MPVolumeView легко предоставлять пользовательский доступ к средству выбора маршрута.

Приложения могут установить аудио опцию сеанса AVAudioSessionCategoryOptionDefaultToSpeaker или используйте AVAudioSessionPortOverrideSpeaker переопределение для функциональности спикерфона. Посмотрите Вопросы и ответы QA1754 для подробных данных.

Предпочтительный метод для переопределения динамику вместо получателя для функциональности спикерфона с помощью MPVolumeView.

Если приложение использует setPreferredInput:error: метод для выбора ввода Bluetooth HFP вывод будет автоматически изменен на вывод Bluetooth HFP. Кроме того, выбирая вывод Bluetooth HFP с помощью MPVolumeViewсредство выбора маршрута автоматически изменит ввод на Bluetooth ввод HFP. Поэтому оба, ввод и вывод будет всегда заканчиваться на Bluetooth устройство HFP даже при том, что только ввод или вывод был установлен индивидуально.



История версии документа


ДатаПримечания
21.01.2014

Передовая статья

03.09.2013

Новый документ, описывающий, как выбрать определенный микрофон «Передняя сторона», «Нижняя часть», «Задняя часть» и т.д., когда доступно на устройстве.