2013-06-17 8 views
9

XAMLとC#を使用してWindowsストア(メトロ)アプリケーションを構築しています。私はシンプルなトーンを演奏し、時間とピッチをコントロールできるようにしたいと思います。私たちがConsole.Beepとやりとりしたことのようなものです。Windowsストア(メトロ)アプリケーションでシンプルなサウンドを再生

私はPlay dynamically-created simple sounds in C# without external librariesを見つけましたが、SoundPlayer(System.Media名前空間)を参照していますが、このタイプのアプリケーションではサポートされていません。

メトロアプリで誰かが(wavファイルを再生していない)サウンドを生成する例はありますか?

+0

私はストリームを試すことができると思います。プレーヤーがファイルを読み込むのをサポートしていない可能性があります。ストリームが動作する可能性があります。http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx 'SoundPlayer(Stream)Constructor 'を参照してください。これが実現することを願っています。 – MarmiK

+3

[WinRTでSharpDXを使って複数のサウンドを同時に再生する方法はありますか?](http://stackoverflow.com/questions/13642944/how-can-i-play-multiple-sounds-at-the-the-same-time-using-winrt)を使用していますか? – Xyroid

+0

純粋なC#とXAMLでこれを行う方法はありませんので、SharpDXとXAudioを使用するか、それぞれのXAudio呼び出しをラップするC++ライブラリを作成することをお勧めします。 – Rafael

答えて

9

以下this記事、私のために[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(); 
} 

ソースがIRandomAccessStreamを自動生成であるので、それは、再生のためのMediaElementを使用しますが、それは柔軟です。

+0

これはWindowsストアアプリケーションに関する質問に記載されているとおり、Kernel32.dllを使用するとアプリが認証に失敗することが理解できます。私は間違っていますか? – JonnyBoats

+0

あなたは正しいと思います。私は混乱を避けるために答えからこのトリビアを削除しました。 – StaWho

関連する問題