更改音量确实会移动滑块,但不会移动音频输出

时间:2012-04-27 08:53:42

标签: c# .net

我的表单中有一个滑块和一个webbrowser对象,滑动它会改变音量,但它会移动滑块,如下所示:Slider does move, but sound output doesn't change

但它不会改变音量的实际输出。这可能是因为我集成了WebBrowser对象并使用Windows 7.当我手动滑动滑块(屏幕截图中显示的滑块)时,音量输出更改。播放.wav文件时,音量输出更改,但不会更改WebBrowser对象。

我正在使用以下代码:

的Xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Slider Minimum="0" Maximum="10" ValueChanged="ValueChanged"/>
    </Grid>
</Window>

C#

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        // Calculate the volume that's being set
        double newVolume = ushort.MaxValue * e.NewValue / 10.0;

        uint v = ((uint) newVolume) & 0xffff;
        uint vAll = v | (v << 16);

        // Set the volume
        int retVal = NativeMethods.WaveOutSetVolume(IntPtr.Zero, vAll);

        Debug.WriteLine(retVal);
    }
}

static class NativeMethods
{
    [DllImport("winmm.dll", EntryPoint = "waveOutSetVolume")]
    public static extern int WaveOutSetVolume(IntPtr hwo, uint dwVolume);

}

2 个答案:

答案 0 :(得分:2)

尝试使用MediaElement

然后你可以像这样播放你的电台:

<MediaElement LoadedBehavior="Manual" x:Name="media" />

media.Source = new Uri(@"http://shoutcastinfo.radiostaddenhaag.com/stad.wax");
media.Play();

更改音量
<Slider Minimum="0" Maximum="1" ValueChanged="ValueChanged"/>

private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    media.Volume = e.NewValue;
}

Windows Mixer和WPF滑块现在都适当地改变音量,但两者的值是独立的,并不反映彼此的变化。

答案 1 :(得分:1)

首先,uint v = ((uint)newVolume) & 0xffff有点多余,uint v = (uint)newVolume会返回相同的结果。

其次,根据the MSDN documentation of the waveOutSetVolume method

大多数设备不支持完整的16位音量控制,并且不会使用所请求音量设置的最低有效位。例如,如果设备支持4位音量控制,则值0x4000,0x4FFF和0x43BE都将被截断为0x4000。 waveOutGetVolume函数返回waveOutSetVolume的完整16位设置。

您是否尝试过大量更改?