2016-09-12 1 views
0

Bonjour, j'essaie de faire correspondre l'audio du système micro au haut-parleur externe de la carte son et le son micro externe au système. En utilisant le codeRéduire le délai de mappage du volume du haut-parleur et du micro à l'aide de naudio C#

public void MapForManualCall() 
    { 
     try 
     { 
      if (db.getResultOnQuery("SELECT [Value] FROM [dbo].[SystemProperties] where property='RecordingEnabled'").Rows[0][0].ToString().Equals("YES")) 
      { 
       SystemMic = new NAudio.Wave.WaveInEvent(); 
       SystemMic.DeviceNumber = 0; 
       SystemMic.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(SystemMic.DeviceNumber).Channels); 

       SoundcardMic = new NAudio.Wave.WaveInEvent(); 
       SoundcardMic.DeviceNumber = 1; 
       SoundcardMic.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(SoundcardMic.DeviceNumber).Channels); 

       //NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream); 

       // used to set listen property of mic on 

       var waveOutReceiver = new NAudio.Wave.WaveOut(); 
       waveOutReceiver.DeviceNumber = 0; 
       // used to wavout caller voice on receiver speaker 
       NAudio.Wave.WaveInProvider waveInProviderCaller = new NAudio.Wave.WaveInProvider(SystemMic); 
       waveOutReceiver.Init(waveInProviderCaller); 
       waveOutReceiver.Play(); 

       var waveOutCaller = new NAudio.Wave.WaveOut(); 
       waveOutCaller.DeviceNumber = 1; 
       // used to wavout receiver voice on caller speaker 
       NAudio.Wave.WaveInProvider waveInProviderReceiver = new NAudio.Wave.WaveInProvider(SoundcardMic); 
       waveOutCaller.Init(waveInProviderReceiver); 
       waveOutCaller.Play(); 


       //sourceStream.StartRecording(); 
       //waveOut.Play(); 


       // SoundcardMic.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable1); 
       // writer1 = new NAudio.Wave.WaveFileWriter(outputFilenameReceiver, SoundcardMic.WaveFormat); 
       SoundcardMic.StartRecording(); 

       //SystemMic.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable); 
       //writer = new NAudio.Wave.WaveFileWriter(outputFilenameCaller, SystemMic.WaveFormat); 
       SystemMic.StartRecording(); 
       // MapSpeakerNMic(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Please Check Headphone and Device Cable Connected Properly!"); 
     } 
    } 

Le code ci-dessus fonctionne parfaitement mais il y a un délai de 3-4 secondes entre les mises en correspondance. Lorsque j'essaie d'utiliser la fonction Listen de Windows 7, cela fonctionne parfaitement. Selon moi, il peut être question de lire le tampon d'écriture. Je ne sais pas comment le faire ...

+0

Vous utilisez une API ancienne. Essayez d'utiliser WasapiCapture/WasapiOut (Vista et ci-dessus). Définissez également une taille de mémoire tampon faible pour éviter les retards. – apocalypse

+0

comment régler la taille du tampon faible .. –

+0

Dans le constructeur WasapiOut. C'est ce qu'on appelle la «latence» (en millisecondes je crois). – apocalypse

Répondre

0

La latence est le problème ici. Il y a latence à l'étape de l'enregistrement et de la lecture. Vous trouverez très difficile de réduire cela à de petites valeurs sans utiliser quelque chose comme ASIO. Cependant, toutes les API de NAudio vous permettent de spécifier la taille de la mémoire tampon afin que vous puissiez voir à quel point vous pouvez descendre avant d'avoir des décrochages.