2013-06-17 6 views
9

Ich baue eine Windows Store (Metro) Anwendung mit XAML und C#. Ich möchte einen einfachen Ton spielen und in der Lage sein, die Dauer und Tonhöhe zu steuern; So wie wir es mit Console.Beep gemacht haben.Spiele einfache Töne in einer Windows-Store (Metro) Anwendung

Ich fand Play dynamically-created simple sounds in C# without external libraries, aber es verweist auf SoundPlayer (System.Media-Namespace), die nicht für diese Art von Anwendung unterstützt wird (außer natürlich, ich vermisse etwas).

Hat jemand ein Beispiel der Erzeugung einen Sounds in einem U-Bahn-app (nicht eine WAV-Datei zu spielen)?

+0

Ich denke, man Strom versuchen kann, da es nicht die Player-Datei laden unterstützen kann, dann kann Strom http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx arbeitet in diesem Verweisen Sie 'SoundPlayer (Stream)' Constructor .. Ich hoffe, dass dies tun wird. – MarmiK

+3

Haben Sie überprüft [Wie kann ich mehrere Sounds gleichzeitig mit SharpDX in WinRT spielen?] (http://stackoverflow.com/questions/13642944/wie-can-i-Play-multiple-Sounds-at-the-same-Zeit-mit-sharpdx-in-WinRT)? – Xyroid

+0

Es gibt keine Möglichkeit, dies auf reinem C# und XAML zu tun, daher empfehle ich Ihnen, SharpDX und XAudio zu verwenden oder eine C++ - Bibliothek zu erstellen, die die entsprechenden XAudio-Aufrufe einhüllt. – Rafael

Antwort

9

Basierend auf this Artikel, arbeitet unter OK für mich:

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(); 
} 

Es verwendet MediaElement für die Wiedergabe aber, da die Quelle ein Auto IRandomAccessStream erzeugt ist, es flexibel ist.

+0

Wie in der Frage angegeben, ist dies für eine Windows Store-Anwendung und es versteht sich, dass die Verwendung der Datei Kernel32.dll dazu führt, dass die App die Zertifizierung nicht besteht. Täusche ich mich? – JonnyBoats

+0

Ich glaube, du hast Recht. Ich entfernte diese Trivia aus der Antwort, um Verwirrung zu vermeiden. – StaWho

Verwandte Themen