2013-06-17 19 views
9

XAML ve C# kullanarak bir Windows Mağaza (Metro) uygulaması yapıyorum. Basit bir ton çalmak ve süreyi ve perdeyi kontrol edebilmek istiyorum; Console.Beep ile yaptığımız türden bir şey.Bir Windows Mağaza (Metro) uygulamasında basit sesler çalma

Play dynamically-created simple sounds in C# without external libraries buldum, ancak bu tür bir uygulama için desteklenmiyor gibi görünen SoundPlayer (System.Media ad alanı) referansları var (tabii ki bir şey kaçırmıyorum).

Herkes metro uygulamasında bir ses oluşturma (wav dosyası yürütmüyor) örneğine sahip mi?

+0

Dosyayı yüklemek için oynatıcıyı desteklemeyebileceğinden akışını deneyebilirsiniz, bu durumda akış http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx adresinde çalışabilir. 'SoundPlayer' (Stream) 'Constuctor 'a bakın .. Umarım bunu yapacaktır .. – MarmiK

+3

[WinRT'de SharpDX'i kullanarak aynı anda birden fazla ses nasıl çalabilirim?] kontrol ettiniz mi? (http://stackoverflow.com/questions/13642944/nasıl-can-i-play-çoklu-ses-at-the-aynı zamanda-kullanarak-sharpdx-in-winrt)? – Xyroid

+0

Saf C# ve XAML'de bunu yapmanın bir yolu yoktur, bu yüzden SharpDX ve XAudio'yu kullanmanızı veya ilgili XAudio çağrılarını sarmalayan bir C++ kitaplığı oluşturmanızı öneririm. – Rafael

cevap

9

this maddeye dayanarak, aşağıda bende çalıştı: Kaynak IRandomAccessStream oluşturulan bir otomatik olduğu için

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

O esnek, oynatma için MediaElement kullanır ama.

+0

Bir Windows Mağazası uygulaması için bu soruda belirtildiği gibi ve Kernel32.dll kullanarak uygulamanın sertifikasyon başarısız olmasına neden olacak benim anlayışım. Yanlış mıyım? – JonnyBoats

+0

Sanırım haklısın. Karışıklığı önlemek için bu trivia'yı cevaptan çıkardım. – StaWho