iPhone上的核心音频 - 改变麦克风增益的任何方式(扬声器麦克风或耳机麦克风)?

时间:2010-05-28 19:07:22

标签: iphone cocoa-touch core-audio microphone audioqueueservices

经过多次搜索,答案似乎不是,但我想在放弃之前我会问这里。对于我正在研究的项目,包括录制声音,当路线是外置麦克风+扬声器和耳机麦克风+耳机时,输入电平听起来有点安静。有没有人明确知道是否可以在Core Audio的任何部分以编程方式更改iPhone上的麦克风增益级别?

如果没有,是否有可能我不是真的处于“扬声器”模式(至少使用外置麦克风)但只是认为我是?这是我的音频会话初始化代码:

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 个答案:

答案 0 :(得分:3)

增益是音频单元的属性。

我没有尝试过,但您应该可以使用此属性键执行AudioUnitSetProperty并关闭“自动增益控制”或简称AGC:kAUVoiceIOProperty_VoiceProcessingEnableAGC

另见kAUVoiceIOProperty_BypassVoiceProcessing

答案 1 :(得分:1)

增益控制是自动的,平均值始终是被认为是“最佳”的水平。您可以通过调音台路由输入以控制音量,但我认为它可能会剪辑。

这是从iphone上的coreAudio开始的一个非常好的地方

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

答案 2 :(得分:0)

对于iOS 5.0及更高版本,您现在可以将AudioSession模式设置为kAudioSessionMode_Measurement。

kAudioSessionMode_Measurement

适用于希望最大限度地减少系统提供的输入和/或输出音频信号处理信号处理效果的应用。

您可以在Core Audio中设置AudioSession模式,如下所示:

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

答案 3 :(得分:0)

从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);
}