Stream.CopyTo(newStream) return Length 0

58 views Asked by At

I try to make some concatenation of buffers which are saved in a memory streams. Then, when I'm trying to play the whole buffer it gives an exception:

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.

When I debug the mStrm is still remains 0, can't find why.

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

I'm targeting windows phone 8.1 silverlight platform

1

There are 1 answers

0
axcelenator On BEST ANSWER

I got the solution for the problem: do the following before calling CopyTo()

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