2016-04-26 75 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