Я пытаюсь выполнить некоторую конкатенацию буферов, которые сохраняются в потоках памяти. Потом, когда я пытаюсь играть весь буфер дает исключение:Stream.CopyTo (newStream) return Length 0
исключение типа «System.ArgumentException» произошло в Microsoft.Xna.Framework.ni.dll, но не обрабатывается пользователем код
Дополнительная информация: Убедитесь, что длина буфера не равна нулю, а соответствует требованиям к выравниванию блоков для аудиоформата.
Когда я отлаживаю mStrm, остается 0, не могу найти почему.
private void mySendClick(object sender, RoutedEventArgs e)
{
var mStrmStartDelimiter = new MemoryStream();
var mStrmEndDelimiter = new MemoryStream();
BinaryWriter writer1 = new BinaryWriter(mStrmStartDelimiter);
Sinus(6500, 200, writer1, 32767);
BinaryWriter writer2 = new BinaryWriter(mStrmEndDelimiter);
Sinus(6800, 200, writer2, 32767);
var mStrm = new MemoryStream();
mStrmStartDelimiter.CopyTo(mStrm);
//ToDO
mStrmEndDelimiter.CopyTo(mStrm);
mStrm.Seek(0, SeekOrigin.Begin);
SoundEffect mySoundPlay = new SoundEffect(mStrm.ToArray(), 16000, AudioChannels.Mono);
mySoundPlay.Play();
}
public static void Sinus(double frequency, int msDuration, BinaryWriter writer, int volume)
{
double TAU = 2 * Math.PI;
double samplesPerSecond = 16000;
double theta = frequency * TAU/(double)samplesPerSecond;
int samples = (int)((decimal)samplesPerSecond * msDuration/1000);
// '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);
}
}
Я нацеливание Windows Phone 8,1 SilverLight платформы