我为Win CE设备开发了C#.Net CF应用程序,但是在播放声音时无法改变扬声器的音量以影响实际音量时遇到了问题。

我使用的接口(interface)是:

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 OS镜像内(例如缺少/不正确的音频驱动程序),还是我在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”(通用窗口wave API?)。

    点击屏幕时,我确实会听到声音,使用“PlaySound”功能,我可以播放波形文件。唯一的问题是我不能影响音量。

    谢谢!

    最佳答案

    我需要查看您的调用代码(以及此处的p / invoke声明也不完整)以确保。您是否知道waveOutSetVolume dwVolume分为两个词,上半部分是左声道音量,下半部分是右声道音量?您发送的值可能会影响行为(您没有显示代码的那部分)。

    该代码可以在一个平台上运行但在另一个平台上无法运行的事实向我表明,这很可能是OS /平台问题。您是否获得屏幕敲击或其他系统事件之类的音频?您有音频控制面板小程序吗?您是否在注册表中寻找音频驱动程序,以确保它既存在于操作系统中又被加载?

    关于c# - 在Windows CE 6.0下为HDA音频设备更改音量和播放声音的界面?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6504457/

    10-12 21:28