在Windows商店(Metro)应用程序中播放简单的声音

本文关键字:播放 简单 声音 应用程序 Windows 商店 Metro | 更新日期: 2023-09-27 18:18:43

我正在使用XAML和c#构建一个Windows Store (Metro)应用程序。我想演奏一个简单的音调,能够控制音长和音高;就像我们以前用Console.Beep做的那样。

我发现播放动态创建简单的声音在c#中没有外部库,但它引用了SoundPlayer (System。媒体名称空间),这种类型的应用程序似乎不支持(当然,除非我遗漏了什么)。

有没有人在地铁应用程序中生成声音(不播放wav文件)的例子?

在Windows商店(Metro)应用程序中播放简单的声音

根据这篇文章,下面的工作对我来说是OK的:

public async Task<IRandomAccessStream> BeepBeep(int Amplitude, int Frequency, int Duration)
{
    double A = ((Amplitude * (System.Math.Pow(2, 15))) / 1000) - 1;
    double DeltaFT = 2 * Math.PI * Frequency / 44100.0;
    int Samples = 441 * Duration / 10;
    int Bytes = Samples * 4;
    int[] Hdr = { 0X46464952, 36 + Bytes, 0X45564157, 0X20746D66, 16, 0X20001, 44100, 176400, 0X100004, 0X61746164, Bytes };
    InMemoryRandomAccessStream ims = new InMemoryRandomAccessStream();
    IOutputStream outStream = ims.GetOutputStreamAt(0);
    DataWriter dw = new DataWriter(outStream);
    dw.ByteOrder = ByteOrder.LittleEndian;
    for (int I = 0; I < Hdr.Length; I++)
    {
        dw.WriteInt32(Hdr[I]);
    }
    for (int T = 0; T < Samples; T++)
    {
        short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T));
        dw.WriteInt16(Sample);
        dw.WriteInt16(Sample);
    }
    await dw.StoreAsync();
    await outStream.FlushAsync();
    return ims;
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
    var beepStream = await BeepBeep(200, 3000, 250);
    mediaElement1.SetSource(beepStream, string.Empty);
    mediaElement1.Play();
}

它使用MediaElement进行播放,但是,由于源是自动生成的IRandomAccessStream,因此它是灵活的。