2016-04-26 10 views
4

イム(LAN-TCP)からリアルタイムに再生します:DMAを使用してPCにマイクロからの音声を送信するバイト配列

  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)) 
        { 
         //???????? 

        } 

       } 
      } 

私はちょうど双子のように聞こえます。しかし、それを保存してから弾くと、私はその曲をとても鮮明に聞きます。 どうしたのですか?バイト配列を再生するにはどうすればいいですか?

これは私にとっても機能しますか?

byte[] bytes = new byte[1400]; 

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

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

"ADC_RegularConvertedValueTab"は1バイトですか?またはバイト配列? – Gabriel

+0

@Gabrielそのバイトはここで見ることができます。 'recBuff [count] = theSockId.dataBuffer [0];' – Choclate

答えて

2

一方、デフォルトのWaveFormatを使用していますが、これは正しいかもしれません。ソース形式と宛先形式の間に意見の不一致があると、間違いなく問題が発生します。

あなたはWaveFormatが正しいことを確認していたら、私は、あなたの波のプレーヤーではなく、MemoryStreamへの入力として、このような何かBufferedWaveProviderを使用することをお勧めします:あなたは満足している時はいつでも、次に

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

recBuffProvider.AddSamplesと電話すると、BufferedWaveProviderにデータがドロップされ、その後WaveOutプレーヤーによって選択されます。

他にも違和感があります。一度に1バイトしか受信していませんか?あなたの非同期ハンドラがやっているようです。これは最良のものではないかもしれません。なぜなら、多くのコンテキストを切り替えることになるからです。一度に複数のバイトを受け取っている場合は、最初のバイトだけを取得して残りのバイトは無視します。それは間違いなく再生中に "予期しない"音を発生させます。

+0

IveはC++でこれを行いました。 – Choclate

関連する問題