2016-04-26 132 views
4

进出口使用DMA从微观将音频发送到PC(LAN-TCP)播放实时:从字节数组

while (1) { 
     U32 max; 
    int r,i; 
    main_TcpNet();  
     if(tcpSend & sendBuffer) 
     { 
     if(selectBuffer) 
      { 
       send_datalog(ADC_RegularConvertedValueTab2,sizeof(ADC_RegularConvertedValueTab2)); 
       sendBuffer = 0; 
      } 
      else 
      { 
       send_datalog(ADC_RegularConvertedValueTab,sizeof(ADC_RegularConvertedValueTab)); 
       sendBuffer = 0; 
      } 


     main_TcpNet(); 

     } 
    } 
} 

我需要实时播放。这是什么做的Ive迄今使用n音讯:

  byte[] recBuff = new byte[1400]; 
public void OnDataReceived(IAsyncResult asyn) 
      { 
       try 
       { 
        SocketPacket theSockId = (SocketPacket)asyn.AsyncState; 
        int iRx = theSockId.thisSocket.EndReceive(asyn); 

        recBuff [count]= theSockId.dataBuffer[0]; 
        count++; 
        if (count >= 1400) 
        { 

         //-------------------------------------------------------------------- 
         for (int i = 0; i < 1400; i += 2) 
          recieveSound[i/2] = recBuff[i] + (recBuff[i + 1] * 256); //turn back to 16bit 
         //-------------------------------------------------------------------- 
         foreach(int data in recieveSound) 
          sound.Add(data); 
         //---------------------------------- 
         if (playStauts) 
         { 

           if (firstplay) 
           { 




          IWaveProvider provider = new RawSourceWaveStream(
                  new MemoryStream(recBuff), new WaveFormat()); 

          _waveOut.Init(provider); 
          _waveOut.Play(); 









            //playThread.Start(); 
            //firstplay = false; 
           } 
          } 
         else 
         { 
          player.Stop(); 
         } 

         count = 0; //RESET THE RecBuff 
        } 
        //--------------------------------------------------------------- 


       } 
       catch (ObjectDisposedException) 
       { 
        System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); 
       } 
       catch (SocketException se) 
       { 
        MessageBox.Show(se.Message); 
       } 

      } 

      private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
      { 
       if (m_clientSocket != null) 
       { 
        m_clientSocket.Close(); 
        m_clientSocket = null; 
       } 
       Close(); 
      } 



      private void frmMain_Load(object sender, EventArgs e) 
      { 
       playThread = new Thread(new ThreadStart(play)); 
       player = new SoundPlayer(filePath); 
       toolStriplbIP.Text = "Your IP: " + GetIP(); 
       btnDisconnect.Enabled = false; 
      } 




      #region Palying Sound 
      private void btnPlay_Click(object sender, EventArgs e) 
      { 
       try 
       { 
        //Array.Clear(sound, 0, sound.Count); 
        buffCount = 0; 
        offsetSound = 0; 
        sound.Clear(); 
        Object objData = "7"; 
        byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString()); 
        if (m_clientSocket != null) 
         m_clientSocket.Send(byData); 
        playStauts = true; 

       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 

       } 
      } 
      private void btnPause_Click(object sender, EventArgs e) 
      { 
       playStauts = false; 
      } 
      #endregion 

      public void play() 
      { 

       while(true){ 

        using (SoundPlayer player = new SoundPlayer(filePath)) 
        { 
         //???????? 

        } 

       } 
      } 

我只是听说像bijilion Buzzes在秒。但是,当我保存并播放它时,我听到的歌曲非常清晰而响亮。 有什么不对?如何在字节数组增长时播放字节数组?

这样做对我来说甚至还能工作吗?

byte[] bytes = new byte[1400]; 

IWaveProvider provider = new RawSourceWaveStream(
         new MemoryStream(bytes), new WaveFormat()); 

_waveOut.Init(provider); 
_waveOut.Play(); 
+0

“ADC_RegularConvertedValueTab”是一个字节吗?或一个字节数组? – Gabriel

+0

@Gabriel它的字节,你可以在这里看到'recBuff [count] = theSockId.dataBuffer [0];' – Choclate

回答

2

首先,您正在使用默认的WaveFormat,这可能是也可能不是正确的。源格式与目标格式之间的不一致将肯定会导致您的问题。

一旦你确定WaveFormat是正确的,我会建议使用BufferedWaveProvider作为输入到你的波球员,而不是MemoryStream,像这样:

WaveFormat Format = new WaveFormat(/* fill in the right parameters here */); 
BufferedWaveProvider Provider = new BufferedWaveProvider(Foramt); 

然后,只要你快乐与您的recBuff,您只需拨打Provider.AddSamples将数据放入BufferedWaveProvider,然后将由您的WaveOut播放器拿起。

还有其他一些奇怪的事情发生。你一次只收到一个字节吗?看起来这就是你的异步处理程序正在做的事情。这可能不是最好的,因为这会导致大量的上下文切换。如果你一次只接收一个以上的字节,那么你只会抓住第一个字节而忽略其余的字节。这无疑会在播放过程中产生“意外”的声音。

+0

我已经在C++中完成了这个,只需要缓冲区谢谢 – Choclate