【求助】关于使用waveOutSetVolume设置音量的问题

【求助】关于使用waveOutSetVolume设置音量的问题,第1张

这和声卡有关系, 如果声卡只有一个输入通道(不是硬件的插孔), 音量或者不变,或者都变. 我的方法是在waveOutWrite之前把buffer里的数据(signed short)按音量重算.

------------------------------------

数据多是16位的,其它衫皮的也有,大同小异.若是16位的,buffer里存的是signed short, 也就是说数值在-32768到32767之间, 如果是双声道,数据是交叉或巧差的:第一个是左声道的,第二宽芹个是右声道的.

将数据按比例缩小或放大可控制音量, 但须注意别弄过了火, 否则会出现喀喀的噪音.

[HKEY_CURRENT_USER/ControlPanel/Volume]"Key"=dword:10002 Keyclicks: 1=soft, 0x10002=loud"Screen"=dword:10002 ScreenTaps: 1=soft, 0x10002=loud"Mute"=dword:7 7=Enable all sounds (1=Notifications, 2=Apps, 4=Events.)"Volume"=dword:ffffffff 0=off, 0xFFFFFFFF=maximum2、系指毕统临时改变系统音量, 但不修改系统当前音量。void SetSoundVolume(DWORD dwVolume) {WAVEFORMATEX wfwf.wFormatTag = WAVE_FORMAT_PCMwf.nChannels = 1wf.nSamplesPerSec = 8000 * 1000wf.wBitsPerSample = 8wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlignwf.cbSize = 0HWAVEOUT hwofor (UINT id = 0id <waveOutGetNumDevs()id++) {if (waveOutOpen(&hwo, id, &wf, 0, 0, CALLBACK_NULL) == MMSYSERR_NOERROR){waveOutSetVolume(hwo, dwVolume)waveOutClose(hwo)}}}dwVolume的值是0x0---0xffff,如果你想使用百分比设置音量,而液缓不使用0到0xFFFF范围,那么你唯埋芹可以用下面的代码:DWORD dwSoundVolumePercents = 50SetSoundVolume( (DWORD)(0xFFFF*1.0*dwSoundVolumePercents/100.0) )3、修改系统的音量(主设备:0)但又不会和系统其他音频设备发生 *** 作冲突.waveOutSetVolume(0, dwVolume)有时候使用:waveOutSetVolume(hwo, dwVolume)会发生打开设备冲突。4、如果要实时保存已经修改了的音量,必须结合注册表保存,并且必须刷新注册表。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12193250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存