Stream.CopyTo(newStream) return 长度 0

Stream.CopyTo(newStream) return Length 0

我尝试对保存在内存流中的缓冲区进行一些串联。然后,当我尝试播放整个缓冲区时,它给出了一个例外:

An exception of type 'System.ArgumentException' occurred in Microsoft.Xna.Framework.ni.dll but was not handled in user code

Additional information: Ensure that the buffer length is non-zero and meets the block alignment requirements for the audio format.

调试的时候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 平台

我找到了问题的解决方案:在调用 CopyTo() 之前执行以下操作

mStrmStartDelimiter.Position = 0;
mStrmEndDelimiter.Position = 0;