我为 Win CE 设备开发 C# .Net CF 应用程序,但在播放声音时改变扬声器音量以影响实际音量时遇到问题。
我使用的界面是:
int waveOutSetVolume(IntPtr hMod, UInt32 dwVolume);
int PlaySound(string szSound, IntPtr hMod, int flags);
我使用的代码在我们的旧设备上运行良好,它具有以下设置:
但是,在新设备上播放声音但我无法更改音量。设置如下:
我不确定这个问题是否存在于 Windows CE 6 操作系统镜像中(例如缺少/不正确的音频驱动程序),或者我是否在我的 C# 代码中使用了不正确的接口(interface)。
欢迎任何帮助和想法!
谢谢,
卡尔
额外细节:
代码:
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”(通用 Window wave api?)。
点击屏幕时确实会听到声音,并且使用“PlaySound”功能可以播放波形文件。唯一的问题是我无法影响音量。
谢谢!
最佳答案
我需要查看您的调用代码(并且您在此处的 p/invoke 声明也不完整)才能确定。你知道waveOutSetVolume dwVolume 被分成两个词,上面的工作是左声道音量,下面的工作是右声道音量?您发送的值可能会影响行为(您没有显示代码的那部分)。
代码在一个平台上运行但在另一个平台上失败的事实向我表明,这可能是一个操作系统/平台问题。您是否收到屏幕点击或其他系统事件等事件的音频?你有音频控制面板小程序吗?您是否在注册表中查找了音频驱动程序以确保它既存在于操作系统中并且也已加载?
关于c# - Windows CE 6.0下HDA Audio设备音量调节和播放声音的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6504457/