2015-06-18 138 views
1

我尝试使保存在内存流中的一些缓冲区连接在一起。然后,当我试图打全缓冲它提供了一个例外:Stream.CopyTo(newStream)返回长度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平台

回答

0

我对问题的解决方案:请执行下列操作调用CopyTo从()

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