1.1 定义及简要说明
函数waveOutSetVolume可以用来调整系统的音量,其定义如下:
MMRESULT WINAPI waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume); |
其中,第一个参数HWAVEOUT hwo可以传入两种值,第一种是wave-out设备ID号,此时函数调整的是设备音量,第二种是Stream句柄,调整的是所指向的Stream的音量。
今天为这个地方晕乎乎了半天,最后还是写了点测试程序才搞懂,有关这个函数的具体使用方法及操作细节请看下面的验证过程。
注:
下面的代码实际上是一个应用程序中部分代码,有关该应用程序的源码可以从我的资源中下载,主界面如下:
1.2 给函数传入wave-out设备ID的验证
下面的代码实现了对设备音量进行调整的功能,对应上图中的Loud和Soft按键的功能。其中函数void CWaveAPI_TestDlg::OnBnClickedButton1()实现了将设备音量(0~0xffff 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); |