Core Audio на iPhone - есть ли способ изменить усиление микрофона (для микрофона громкой связи или микрофона для наушников)? - PullRequest
3 голосов
/ 28 мая 2010

После долгих поисков ответа, похоже, нет, но я подумал спросить здесь, прежде чем сдаться. Для проекта, над которым я работаю, который включает в себя запись звука, входные уровни звучат немного тихо, как при маршруте внешнего микрофона + динамика, так и при подключении наушников с микрофоном + наушниками. Кто-нибудь точно знает, возможно ли программно изменять уровни усиления микрофона на iPhone в любой части Core Audio?

Если нет, то возможно ли, что я на самом деле не в режиме «громкой связи» (по крайней мере, с внешним микрофоном), а только думаю, что я нахожусь? Вот мой код инициализации аудио сеанса:

OSStatus error = AudioSessionInitialize(NULL, NULL, audioQueueHelperInterruptionListener, r);

[...some error checking of the OSStatus...]

UInt32 category = kAudioSessionCategory_PlayAndRecord; // need to play out the speaker at full volume too so it is necessary to change default route below
error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
if (error) printf("couldn't set audio category!");

UInt32 doChangeDefaultRoute = 1;
error = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);
if (error) printf("couldn't change default route!");

error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioQueueHelperPropListener, r);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);

UInt32 inputAvailable = 0;
UInt32 size = sizeof(inputAvailable);

error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", (int)error);

error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, audioQueueHelperPropListener, r);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);

error = AudioSessionSetActive(true); 
if (error) printf("AudioSessionSetActive (true) failed");

Большое спасибо за любые указатели.

Ответы [ 4 ]

3 голосов
/ 28 мая 2010

Gain является собственностью Audio Unit.

Я не пробовал, но вы должны иметь возможность AudioUnitSetProperty и кратко отключить «Автоматический контроль усиления» или AGC с помощью этого ключа свойства: kAUVoiceIOProperty_VoiceProcessingEnableAGC

См. Также kAUVoiceIOProperty_BypassVoiceProcessing

1 голос
/ 28 мая 2010

Регулировка усиления автоматическая, среднее значение всегда будет уровнем, который считается «оптимальным». Вы могли бы направить ввод через микшер для управления громкостью, но я думаю, что он, вероятно, обрезает.

Это довольно хорошее место, чтобы начать с coreAudio на iphone

http://www.subfurther.com/blog/?p=507

0 голосов
/ 12 июня 2014

Начиная с iOS 5, вы можете установить глобальную настройку усиления аналогового входа следующим образом

UInt32 uInt32Size = sizeof(UInt32);
UInt32 isGainAvaiable = 0;
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_InputGainAvailable, &uInt32Size, &isGainAvaiable);
if (isGainAvaiable)
{
    Float32 gainFloat = 0.142857f; //for example...
    status = AudioSessionSetProperty(kAudioSessionProperty_InputGainScalar, sizeof(gainFloat), &gainFloat);
}
0 голосов
/ 29 марта 2013

Для iOS 5.0 и более поздних версий теперь вы можете установить режим AudioSession в kAudioSessionMode_Measurement.

kAudioSessionMode_Measurement

Подходит для приложений, которые хотят минимизировать эффект системной обработки сигналов для входных и / или выходных аудиосигналов.

Вы можете установить режим AudioSession в Core Audio следующим образом:

UInt32 mode = kAudioSessionMode_Measurement;
AudioSessionSetProperty(kAudioSessionProperty_Mode, sizeof(mode), &mode)
...