Wave Driver介绍-3(Wave API waveOutSetVolume)

本文介绍了Windows API函数waveOutSetVolume的用法,详细讲解了如何通过设备ID和Stream句柄调整音量。内容包括设备音量调整的实现,以及创建Stream并调整Stream音量的函数PlayBackSound的详细代码示例。
摘要由CSDN通过智能技术生成

1.1 定义及简要说明

函数waveOutSetVolume可以用来调整系统的音量,其定义如下:

MMRESULT WINAPI waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume);

         其中,第一个参数HWAVEOUT hwo可以传入两种值,第一种是wave-out设备ID号,此时函数调整的是设备音量,第二种是Stream句柄,调整的是所指向的Stream的音量。

         今天为这个地方晕乎乎了半天,最后还是写了点测试程序才搞懂,有关这个函数的具体使用方法及操作细节请看下面的验证过程。

注:

         下面的代码实际上是一个应用程序中部分代码,有关该应用程序的源码可以从我的资源中下载,主界面如下:

1.2 给函数传入wave-out设备ID的验证

         下面的代码实现了对设备音量进行调整的功能,对应上图中的LoudSoft按键的功能。其中函数void CWaveAPI_TestDlg::OnBnClickedButton1()实现了将设备音量(00xffff ffff)增加0x1000的功能,也即Loud按钮的功能,而按钮Soft的功能由函数void CWaveAPI_TestDlg::OnBnClickedButton2()实现,每次点击该按钮设备音量将减少0x1000

详细如下:

static DWORD g_dwWaveOutGain = 0;

 

void CWaveAPI_TestDlg::OnBnClickedButton1()

{

     // TODO: Add your control notification handler code here

     DWORD dwDeviceID = 0;

     DWORD deDeviceGain = 0;

 

     for (dwDeviceID = 0; dwDeviceID < waveOutGetNumDevs(); dwDeviceID++)  {

 

         NKDbgPrintfW(L"Device #%d/r/n", dwDeviceID);

 

         waveOutSetVolume((HWAVEOUT)dwDeviceID, g_dwWaveOutGain);

         waveOutGetVolume((HWAVEOUT)dwDeviceID, &deDeviceGain);

 

         NKDbgPrintfW(L"/r/n         dst 0x%8x, read 0x%8x/r/n", g_dwWaveOutGain, deDeviceGain);

 

         if (g_dwWaveOutGain <= (0xffffffff - 0x1000))

              g_dwWaveOutGain+=0x1000;

         else

              g_dwWaveOutGain = 0xffffffff;

     }

}

 

void CWaveAPI_TestDlg::OnBnClickedButton2()

{

     // TODO: Add your control notification handler code here    

     DWORD dwDeviceID = 0;

     DWORD deDeviceGain = 0;

 

     for (dwDeviceID = 0; dwDeviceID < waveOutGetNumDevs(); dwDeviceID++)  {

 

         NKDbgPrintfW(L"Device #%d/r/n", dwDeviceID);

 

         waveOutSetVolume((HWAVEOUT)dwDeviceID, g_dwWaveOutGain);

         waveOutGetVolume((HWAVEOUT)dwDeviceID, &deDeviceGain);

 

         NKDbgPrintfW(L"/r/n         dst 0x%8x, read 0x%8x/r/n", g_dwWaveOutGain, deDeviceGain);

 

         if (g_dwWaveOutGain >= 0x1000)

              g_dwWaveOutGain-=0x1000;

         else

              g_dwWaveOutGain = 0;

     }

}

1.3 给函数传入Stream句柄的验证

         下面的代码中包括下面三个函数:

int StringFormatToWaveFormatEx( WAVEFORMATEX *wfx, const TCHAR* szWaveFormat );

ULONG SineWave( void* pBuffer, ULONG ulNumBytes, WAVEFORMATEX *pwfx, double dFrequency );

void PlayBackSound(bool bLoud);

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值