2016-04-03 6 views
0

Я пытаюсь позвонить с помощью команды AT и Naudio LIB для отправки и получения голоса модему, а входящий голос - к модему, работающему нормально, но исходящий голос запутан (шум)сделать голосовой вызов C# с помощью команды и NAudio lib

Любая помощь приветствуется.

Вот код:

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()каждый раз, когда вы получаете новые данные о последовательном порту. Это не будет работать очень хорошо!