2015-06-18 2 views
3

У меня есть буфер, содержащий образцы синуса, которые я хочу периодически воспроизводить из потока памяти. Есть ли эффективный способ играть в нее, не имея пробелов во времени? Я пытаюсь создать свой собственный генератор сигналов (я знаю, что некоторые библиотеки предоставляют это, но я хочу создать его самостоятельно).периодически воспроизводить звук из потока памяти C#

Платформа Windows Phone 8.1 Silverlight

Update: код берется из этого форума где-то

public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 
    { 
     var mStrm = new MemoryStream(); 
     BinaryWriter writer = new BinaryWriter(mStrm); 
     const double TAU = 2 * Math.PI;   
     int samplesPerSecond = 44100; 

     { 
      double theta = frequency * TAU/(double)samplesPerSecond; 
      // 'volume' is UInt16 with range 0 thru Uint16.MaxValue (= 65 535) 
      // we need 'amp' to have the range of 0 thru Int16.MaxValue (= 32 767) 
      double amp = volume >> 2; // so we simply set amp = volume/2 
      for (int step = 0; step < samples; step++) 
      { 
       short s = (short)(amp * Math.Sin(theta * (double)step)); 
       writer.Write(s); 
      } 
     } 


    } 
+0

Что вы имеете в виду, "играть в случайном порядке"? И покажи нам свой код. – Luaan

+0

Я обновил сообщение с кодом. Я имею в виду случайным образом, чтобы сигнал воспроизводился без остановок, пока я не скажу ему остановиться – axcelenator

+0

Значит, вы действительно имеете в виду «периодически»? Например. устойчивый тон без перерывов? – Luaan

ответ

1

Вот как я это сделал - просто создать новый объект SoundEffectInstance и установить его на возвращение значение SoundEffect.CreateInstance.

https://msdn.microsoft.com/en-us/library/dd940203.aspx

SoundEffect mySoundPlay = new SoundEffect(mStrm.ToArray(), 16000,AudioChannels.Mono); 
SoundEffectInstance instance = mySoundPlay.CreateInstance(); 
instance.IsLooped = true; 
instance.Play();