[xiph-commits] r12102 - trunk/speex/speexclient

jm at svn.xiph.org jm at svn.xiph.org
Mon Nov 13 06:12:17 PST 2006


Author: jm
Date: 2006-11-13 06:12:14 -0800 (Mon, 13 Nov 2006)
New Revision: 12102

Modified:
   trunk/speex/speexclient/speexclient.c
Log:
Comments and a bit of cleaning up


Modified: trunk/speex/speexclient/speexclient.c
===================================================================
--- trunk/speex/speexclient/speexclient.c	2006-11-13 09:57:09 UTC (rev 12101)
+++ trunk/speex/speexclient/speexclient.c	2006-11-13 14:12:14 UTC (rev 12102)
@@ -70,6 +70,9 @@
    int local_port, remote_port;
    int nfds;
    struct pollfd *pfds;
+   SpeexPreprocessState *preprocess;
+   AlsaDevice *audio_dev;
+   int tmp;
 
    if (argc != 5)
    {
@@ -113,11 +116,11 @@
       exit(1);
    }
 
-   AlsaDevice *audio_dev = alsa_device_open(argv[1], SAMPLING_RATE, 1, FRAME_SIZE);
-   int tmp;
+   /* Setup audio device */
+   audio_dev = alsa_device_open(argv[1], SAMPLING_RATE, 1, FRAME_SIZE);
    
+   /* Setup the encoder and decoder in wideband */
    void *enc_state, *dec_state;
-   SpeexPreprocessState *preprocess;
    enc_state = speex_encoder_init(&speex_wb_mode);
    tmp = 8;
    speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &tmp);
@@ -129,10 +132,10 @@
    SpeexBits enc_bits, dec_bits;
    speex_bits_init(&enc_bits);
    speex_bits_init(&dec_bits);
-   preprocess = speex_preprocess_state_init(FRAME_SIZE, SAMPLING_RATE);
    
+   
    struct sched_param param;
-   //param.sched_priority = 40;
+   /*param.sched_priority = 40; */
    param.sched_priority = sched_get_priority_min(SCHED_FIFO);
    if (sched_setscheduler(0,SCHED_FIFO,&param))
       perror("sched_setscheduler");
@@ -140,25 +143,32 @@
    int send_timestamp = 0;
    int recv_started=0;
    
+   /* Setup all file descriptors for poll()ing */
    nfds = alsa_device_nfds(audio_dev);
    pfds = malloc(sizeof(*pfds)*(nfds+1));
    alsa_device_getfds(audio_dev, pfds, nfds);
-
    pfds[nfds].fd = sd;
    pfds[nfds].events = POLLIN;
 
-   alsa_device_start(audio_dev);
-
+   /* Setup jitter buffer using decoder */
    SpeexJitter jitter;
    speex_jitter_init(&jitter, dec_state, SAMPLING_RATE);
+   
+   /* Echo canceller with 200 ms tail length */
    SpeexEchoState *echo_state = speex_echo_state_init(FRAME_SIZE, 10*FRAME_SIZE);
    tmp = SAMPLING_RATE;
    speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &tmp);
 
+   /* Setup preprocessor and associate with echo canceller for residual echo suppression */
+   preprocess = speex_preprocess_state_init(FRAME_SIZE, SAMPLING_RATE);
    speex_preprocess_ctl(preprocess, SPEEX_PREPROCESS_SET_ECHO_STATE, echo_state);
    
+   alsa_device_start(audio_dev);
+   
+   /* Infinite loop on capture, playback and receiving packets */
    while (1)
    {
+      /* Wait for either 1) capture 2) playback 3) socket data */
       poll(pfds, nfds+1, -1);
       /* Received packets */
       if (pfds[nfds].revents & POLLIN)
@@ -170,38 +180,53 @@
    
          if ((payload & 0x80000000) == 0) 
          {
+            /* Put content of the packet into the jitter buffer, except for the pseudo-header */
             speex_jitter_put(&jitter, msg+8, n-8, recv_timestamp);
             recv_started = 1;
          }
 
       }
+      /* Ready to play a frame (playback) */
       if (alsa_device_playback_ready(audio_dev, pfds, nfds))
       {
          short pcm[FRAME_SIZE];
          if (recv_started)
          {
+            /* Get audio from the jitter buffer */
             speex_jitter_get(&jitter, pcm, NULL);
          } else {
             for (i=0;i<FRAME_SIZE;i++)
                pcm[i] = 0;
          }
+         /* Playback the audio and reset the echo canceller if we got an underrun */
          if (alsa_device_write(audio_dev, pcm, FRAME_SIZE))
             speex_echo_state_reset(echo_state);
+         /* Put frame into playback buffer */
          speex_echo_playback(echo_state, pcm);
       }
+      /* Audio available from the soundcard (capture) */
       if (alsa_device_capture_ready(audio_dev, pfds, nfds))
       {
          short pcm[FRAME_SIZE], pcm2[FRAME_SIZE];
          char outpacket[MAX_MSG];
+         /* Get audio from the soundcard */
          alsa_device_read(audio_dev, pcm, FRAME_SIZE);
+         
+         /* Perform echo cancellation */
          speex_echo_capture(echo_state, pcm, pcm2);
          for (i=0;i<FRAME_SIZE;i++)
             pcm[i] = pcm2[i];
          
          speex_bits_reset(&enc_bits);
+         
+         /* Apply noise/echo suppression */
          speex_preprocess_run(preprocess, pcm);
+         
+         /* Encode */
          speex_encode_int(enc_state, pcm, &enc_bits);
          int packetSize = speex_bits_write(&enc_bits, outpacket+8, MAX_MSG);
+         
+         /* Pseudo header: four null bytes and a 32-bit timestamp */
          ((int*)outpacket)[0] = htonl(0);
          ((int*)outpacket)[1] = send_timestamp;
          send_timestamp += FRAME_SIZE;



More information about the commits mailing list