在Windows CE 6.0下更改HDA音频设备音量和播放声音的接口
本文关键字:播放声音 接口 音频 CE Windows 0下 HDA | 更新日期: 2023-09-27 18:00:30
我为Win CE设备开发C#.Net CF应用程序,在播放声音时,扬声器音量变化会影响实际音量,但遇到问题。
我使用的接口是:
int waveOutSetVolume(IntPtr hMod, UInt32 dwVolume);
int PlaySound(string szSound, IntPtr hMod, int flags);
我使用的代码与我们的旧设备配合得很好,该设备具有以下设置:
- AC'97音频编解码器,Windows CE 5,.Net CF 2.0
然而,在新设备上播放声音,但我无法更改音量。设置如下:
- HDA音频编解码器,Windows CE 6,.Net CF 3.5
我不确定这个问题是否在Windows CE 6操作系统映像中(例如,缺少/不正确的音频驱动程序),或者我在C#代码中使用了不正确的接口。
欢迎任何帮助和想法!
谢谢,
Karl
其他详细信息:
代码:
public unsafe int SetVolume(int newVolumeInPercent)
{
UInt32 newVol = (UInt32)((double)(newVolumeInPercent * ushort.MaxValue) / 100.0);
newVol = newVol + (newVol << 16);
int resultSetVolume = waveOutSetVolume(IntPtr.Zero, newVol);
return (int)Math.Round((double)resultSetVolume * 100 / ushort.MaxValue);
}
public void playSound(string soundFile)
{
PlaySound(soundFile, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME));
}
[DllImport("CoreDll.dll")]
private extern static int waveOutSetVolume(IntPtr hMod, UInt32 dwVolume);
[DllImport("CoreDll.dll", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int PlaySound(string szSound, IntPtr hMod, int flags);
private enum Flags
{
SND_ASYNC = 0x0001,
SND_FILENAME = 0x00020000,
}
正如您在代码中看到的,我对左右声道都使用了参数百分比音量。
使用Windows CE远程进程查看器,我可以看到音频驱动程序(即"jwavehda.dll")已加载。此外,还会加载"waveapi.dll"(通用窗口waveapi?)。
我在敲击屏幕时确实会听到声音,使用"播放声音"功能我可以播放波形文件。唯一的问题是我不能影响音量。
谢谢!
我需要查看您的调用代码(这里的p/invoke声明也不完整)以确定。您是否知道waveOutSetVolume dwVolume分为两个字,上功为左通道音量,下功为右通道音量?您在中发送的值可能会影响行为(您没有显示代码的那部分)。
代码在一个平台上工作,但在另一个平台中失败,这一事实向我表明,这很可能是操作系统/平台的问题。你有屏幕敲击或其他系统事件的音频吗?你有音频控制面板小程序吗?您是否在注册表中查找音频驱动程序,以确保它既存在于操作系统中,又已加载?