2016-04-26 6 views
4

Im Senden von Audio von Mikro zum PC mit dma (LAN-TCP):Wiedergabe Echtzeit von Byte-Array

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

     } 
    } 
} 

Ich brauche es in Echtzeit zu spielen .Dies ist, was Ive bisher getan NAudio mit:

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

        } 

       } 
      } 

Ich höre gerade wie ein bijilion Buzzes in sek. Aber wenn ich es speichere und dann spiele, höre ich das Lied sehr klar und laut. Was ist los? Wie kann ich mein Byte-Array spielen, wenn es wächst?

funktioniert das überhaupt für mich?

byte[] bytes = new byte[1400]; 

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

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

Ist "ADC_RegularConvertedValueTab" ein Byte? oder ein Byte-Array? – Gabriel

+0

@Gabriel sein Byte, wie Sie hier sehen können 'recBuff [count] = theSockId.dataBuffer [0];' – Choclate

Antwort

2

Für eine Sache, verwenden Sie die Standard-WaveFormat, die nicht korrekt sind oder nicht. Unstimmigkeiten zwischen Quell- und Zielformaten werden definitiv Probleme verursachen.

Sobald Sie sicher sind, die WaveFormat richtig ist, würde ich vorschlagen, eine BufferedWaveProvider als Eingabe für Ihre Wave-Player statt der MemoryStream, etwa wie folgt:

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

Dann, wenn du glücklich bist Mit Ihrer recBuff rufen Sie einfach Provider.AddSamples an, um die Daten in die BufferedWaveProvider zu legen, die dann von Ihrem WaveOut Player abgeholt wird.

Es gibt noch andere seltsame Dinge. Erhalten Sie nur ein Byte zu einem Zeitpunkt? Es sieht so aus, als würde der asynchrone Handler dies tun. Dies ist möglicherweise nicht die beste Sache, da dies zu vielen und vielen Kontextwechsel führen wird. Wenn Sie mehr als ein Byte gleichzeitig erhalten, greifen Sie nur das erste und ignorieren den Rest. Das wird zweifellos zu "unerwarteten" Sounds während der Wiedergabe führen.

+0

Ive getan dies in C++. Ich brauchte nur den Puffer danke – Choclate