2016-04-03 21 views
0

AT modunu ve Naudio LIB kullanarak modeme bir ses göndermek ve almak için modemi çalıştıran bir ses alıyorum ve modem çalışıyorken ses çıkışı geliyor ama giden ses sarılıyor (noisy)sesli arama yapmak C# komutunu kullanarak ve NAudio lib

Herhangi bir yardım için teşekkür ederiz.

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

Daha fazla bilgi ekleyebilir misiniz? Senin problemin ne ? Başka istisnalarınız var mı? – Thomas

cevap

1

Sen, doğru kendinize gönderiyoruz: Burada

kodudur? Eğer öyleyse, gelen sesin iyi olduğunu nasıl belirlediniz, ama giden çamurlu mu? Hepsi çamurlu olmaz mıydı?

Temel olarak yalnızca bir akış verisi uygulamasıdır ve veriler sadece PCM sesi olur. Bir seri bağlantı noktası gerçek anlamda uygun değildir (ses hızını desteklemek için yeterli sayıda bps olduğundan emin olmanız dışında).

İşte fark ettiğim bir şey. Mikrofon girişi tarafında, var:

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

Ancak hoparlör çıkış tarafında şunlara sahip:

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

... 

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

    waveOut.Play(); 

    ++i; 
} 

İlk Noktası: başlatmak gerekir BufferedWaveProvider kullandığınız aynı WaveFormat ile giriş için.

İkinci nokta: aşağıdaki gibi bir üst blok içine `waveOut.Play()' taşıyın:

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

    ++i; 

kodunuzu şu anda oturur yolu, aradığınız waveOut.Play()her zaman Alacağınız Seri bağlantı noktasında yeni veriler. Bu çok iyi çalışmayacak!