Windows下Core Audio APIS 音频应用开发(四)

时间:2020-11-30 03:25:27

     前面说了音频数据的采集和播放,接下来我们说说如何利用Core Audio APIS来控制音量。

    从官网文档的编排上看,在介绍Volume Controls之前,文档上先给我们介绍了一个比较重要的概念:Audio Sessions!大家可以去看看,我觉得还是有必要了解下的(我也还没有理解透彻,就不误导大家了)。

     下面看看Core Audio API关于音量控制这方面的函数吧,主要有:

     1. ISimpleAudioVolume

     2. IChannelAudioVolume

     3.IAudioStreamVolume

     4.IAudioEndpointVolume 

  其中,前面三种只适用于共享模式,第四种可用于独占模式,也可用于共享模式。前面三种Api的用法很相似,在此只介绍IChannelAudioVolume的用法,下面直接上代码:

     

    hr = CoCreateInstance(
CLSID_MMDeviceEnumerator, NULL,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
(void**)&pEnumerator);
EXIT_ON_ERROR(hr)

hr = pEnumerator->GetDefaultAudioEndpoint(
eCapture, eConsole, &pDevice);
EXIT_ON_ERROR(hr);
    hr = pDevice->Activate(
IID_IAudioClient, CLSCTX_ALL,
NULL, (void**)&pAudioClient);
EXIT_ON_ERROR(hr)

hr = pAudioClient->GetMixFormat(&pwfx);
EXIT_ON_ERROR(hr)
    hr = pAudioClient->Initialize(
AUDCLNT_SHAREMODE_SHARED,
0,
hnsRequestedDuration,
0,
pwfx,
NULL);
EXIT_ON_ERROR(hr)

hr = pAudioClient->GetBufferSize(&bufferFrameCount);
EXIT_ON_ERROR(hr)
    hr = pAudioClient->GetService(
IID_IAudioCaptureClient,
(void**)&pCaptureClient);


       //前面的代码不解释,下面是创建一个音量控制的指针,获取接口,设置音量,很简单吧

        IChannelAudioVolume *   _IChannelAudioVolume;
hr = pAudioClient->GetService(IID_IChannelAudioVolume,(void**)&_IChannelAudioVolume);
float volume[2] = {1.0,1.0};
_IChannelAudioVolume->SetAllVolumes(2,volume,NULL);


     关于IAUDIOEndpointVolume的用法,略显复杂,不过官网给出了详细的参考代码,大家可自行去查看,https://msdn.microsoft.com/en-us/library/dd370839(v=vs.85).aspx

    具体思路是:

     1. 自定义一个回调类(从IAudioEndpointVolumeCallback 派生,重写相应的一些函数)

     2. 定义IAudioEndpointVolume指针,并获取相应的接口

     3. 注册回调(主要是为了客户端程序获悉音量发生变化时,能做出相应的处理,比如调解音量滑动条等等)