2016-04-26 4 views
4

Im отправляет звук от микро к ПК с помощью ДМА (LAN-TCP):Play Real Time из массива байт

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 сделано до сих пор, используя NAudio:

  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" байтом? или массив байтов? – 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

Ive сделал это в C++. Просто нужен буфер, спасибо – Choclate