在 OSX 中以编程方式更改麦克风增益

Posted

技术标签:

【中文标题】在 OSX 中以编程方式更改麦克风增益【英文标题】:Change Mic gain programmatically in OSX 【发布时间】:2013-02-27 16:37:23 【问题描述】:

我在 OSX 10.8 上

在我的应用程序中,我必须更改麦克风增益,我正在使用 AudioQueue 来捕获缓冲区,但没有获得任何指针来更改麦克风增益,

Apple HAL 文档也有,但没有得到任何东西,

【问题讨论】:

【参考方案1】:

首先,向您的队列询问其kAudioQueueProperty_CurrentDevice,这是它正在读取的设备的标识符字符串。

接下来,您需要打开该设备。这比应有的工作要多,因为 Core Audio 的设计者相信通过通用的“GetProperty”和“SetProperty”函数可以完成几乎所有事情。如下:

    创建一个AudioValueTranslation 结构,其中包含一个指向包含设备标识符的变量的指针和一个指向您希望在其中AudioDeviceID 的变量的指针。 使用AudioHardwareGetProperty 或不推荐使用但更通用的AudioObjectGetProperty 来获取kAudioHardwarePropertyDeviceForUID,将指针传递给结构。 HAL 将查找设备并通过您放入结构中的指针将其返回给您。

如果这没有返回错误,那么您现在有了一个设备。

最后一步是设置它的增益。我认为这在输入范围上表现为kAudioDevicePropertyVolumeScalar,但我不确定100%。无论如何,在找到正确的组合之前,您将不断修改 AudioDeviceSetProperty 和/或 AudioObjectSetProperty

【讨论】:

我试过了,但我不能 AudioObjectHasProperty 总是为麦克风返回错误,而且,我需要在 AudioQueue 运行时这样做:(,在这里发布了一些解决方法......【参考方案2】:

看来,AudioQueue 运行时无法即时更改音量增益,一些如何在缓冲区中添加麦克风增益,发布代码,

void AQRecorder::setGain(void *data, int bytes, float gain)
    SInt16 *editBuffer = (SInt16 *)data;

    // loop over every packet

    for (int nb = 0; nb < (bytes / 2); nb++) 

        // we check if the gain has been modified to save resoures
        if (gain != 0) 
            // we need more accuracy in our calculation so we calculate with doubles
            double gainSample = ((double)editBuffer[nb]) / 32767.0;

            /*
             at this point we multiply with our gain factor
             we dont make a addition to prevent generation of sound where no sound is.

             no noise
             0*10=0

             noise if zero
             0+10=10
             */
            gainSample *= gain;

            /**
             our signal range cant be higher or lesser -1.0/1.0
             we prevent that the signal got outside our range
             */
            gainSample = (gainSample < -1.0) ? -1.0 : (gainSample > 1.0) ? 1.0 : gainSample;

            /*
             This thing here is a little helper to shape our incoming wave.
             The sound gets pretty warm and better and the noise is reduced a lot.
             Feel free to outcomment this line and here again.

             You can see here what happens here http://silentmatt.com/javascript-function-plotter/
             Copy this to the command line and hit enter: plot y=(1.5*x)-0.5*x*x*x
             */

            gainSample = (1.5 * gainSample) - 0.5 * gainSample * gainSample * gainSample;

            // multiply the new signal back to short
            gainSample = gainSample * 32767.0;

            // write calculate sample back to the buffer
            editBuffer[nb] = (SInt16)gainSample;
        
    

记住这个函数只能在有增益变化的时候调用,否则会节省CPU资源..

【讨论】:

以上是关于在 OSX 中以编程方式更改麦克风增益的主要内容,如果未能解决你的问题,请参考以下文章

iPhone上的Core Audio - 任何改变麦克风增益的方法(扬声器麦克风或耳机麦克风)?

闪光灯对象中麦克风对象的增益和活动水平之间的相关性

录制时通过 Swift OSX 音频

在 vb.net 中设置系统记录级别

OSX 如何判断用户何时插入/拔出带有内置麦克风的耳机

如何以编程方式在 Android 中调整麦克风音量