2016-04-03 42 views
0

我想撥打電話使用AT命令和Naudio LIB發送和接收語音到調制解調器和傳入語音到調制解調器工作正常,但傳出的聲音混亂(嘈雜)撥打語音電話C#使用命令和NAudio庫

任何幫助表示讚賞。

下面是代碼:

WaveIn waveSource; 
    SerialPort portsend  = new SerialPort("COM20", 57600, Parity.None , 8 , StopBits.One); 
    SerialPort portReceived = new SerialPort("COM19", 57600, Parity.None , 8 , StopBits.One); 
    WaveOut waveOut = new WaveOut(); 
    WaveFormat format = new WaveFormat(8000, 16,1); 

    // button call number 
private void button1_Click(object sender, EventArgs e) 
     { 
     waveSource = new WaveIn(this.Handle); 
     waveSource.WaveFormat = new WaveFormat(8000,16, 1); 
     waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable); 


     waveOut.DesiredLatency = 100; 

     portReceived.Open(); 
     portsend.Open(); 
     portsend.ReadTimeout = SerialPort.InfiniteTimeout; 
     portsend.WriteLine("ATZ;" + Environment.NewLine); 
     Thread.Sleep(1000); 
     portsend.WriteLine("ATD01271698522;" + Environment.NewLine); 
     portReceived.DataReceived += new SerialDataReceivedEventHandler(modemPort_DataReceived); // received the binary of voice come from the modem 
     Thread.Sleep(1000); 
     portsend.Write("AT^DDSETEX=2" + Environment.NewLine); 
     waveSource.StartRecording(); 
    } 

    int i = 0; 
    byte[] buffer; 
    private BufferedWaveProvider _bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 16,1)); 

    void modemPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs args) 
    { 
     int x = portReceived.BytesToRead; 
     buffer = new byte[x]; 
     portReceived.Read(buffer, 0, x); 
     _bufferedWaveProvider.AddSamples(buffer, 0, x); 

     if(i==0) 
     {  
      waveOut.Init(_bufferedWaveProvider); 
     } 

     waveOut.Play(); 

     ++i; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     portsend.Close(); 
     portReceived.Close(); 


    } 

    void waveSource_DataAvailable(object sender, WaveInEventArgs e) 
    { 
     portReceived.Write(e.Buffer, 0, e.BytesRecorded); // send the voice from mic to the modem 
    } 
+1

你能增加更多的信息嗎?你有什麼問題 ?你有什麼例外,其他? – Thomas

回答

1

你發送給自己,是否正確?如果是這樣,你怎麼確定傳入的聲音是好的,但傳出是泥濘的?難道這一切都是泥濘的嗎?

這基本上只是一個流數據應用程序,而數據恰好是PCM音頻。它是串口的事實並不相關(除了確保你有足夠的bps來支持音頻速率)。

這是我注意到的東西。在麥克風輸入端,您有:

waveSource = new WaveIn(this.Handle); 
    waveSource.WaveFormat = new WaveFormat(8000,16, 1); 
    waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable); 

然而,在揚聲器輸出端,你必須:

private BufferedWaveProvider _bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 16,1)); 

... 

    if(i==0) 
    {  
     waveOut.Init(_bufferedWaveProvider); 
    } 

    waveOut.Play(); 

    ++i; 
} 

第一點:你應該初始化BufferedWaveProvider與你使用相同WaveFormat爲輸入。

二點:移動`waveOut.Play()」到它上面的塊,如下所示:

if(i==0) 
    {  
     waveOut.Init(_bufferedWaveProvider); 
     waveOut.Play(); 
    } 

    ++i; 

你的代碼目前是這樣的,你打電話waveOut.Play()每次你串口上的新數據。這不會很好!