Changeset 2140:7665a1f08287 in roaraudio


Ignore:
Timestamp:
07/24/09 03:29:18 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added a simple anti echo, dosn't worl but sounds funny

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roarclients/roarphone.c

    r2129 r2140  
    3030#define DRIVER  "oss" 
    3131 
     32// anti echo: 
     33#define AE_NONE      0 
     34#define AE_SIMPLE    1 
     35#define AE_SPEEX     2 
     36 
     37struct { 
     38 int antiecho; 
     39} g_conf; 
     40 
    3241void usage (void) { 
    3342 printf("roarcat [OPTIONS]...\n"); 
     
    5564} 
    5665 
     66int anti_echo16(int16_t * buf, int16_t * aebuf, size_t len) { 
     67 size_t i; 
     68 
     69 switch (g_conf.antiecho) { 
     70  case AE_NONE: 
     71    return 0; 
     72   break; 
     73  case AE_SIMPLE: 
     74    for (i = 0; i < len; i++) 
     75     buf[i] -= aebuf[i]; 
     76   break; 
     77  default: 
     78    return -1; 
     79   break; 
     80 } 
     81 
     82 return -1; 
     83} 
     84 
    5785int run_stream (struct roar_vio_calls * s0, struct roar_vio_calls * s1, struct roar_audio_info * info) { 
    5886 size_t len; 
    59  char * buf; 
    60  ssize_t l; 
     87 void * outbuf, * micbuf; 
     88 ssize_t outlen, miclen; 
    6189 
    6290 len = (info->rate / 100) * info->channels * info->bits / 8; 
    6391 
    64  if ( (buf = malloc(len)) == NULL ) 
     92 if ( (outbuf = malloc(2*len)) == NULL ) 
    6593  return -1; 
    6694 
     95 micbuf = outbuf + len; 
     96 
    6797 while (1) { 
    68   if ( (l = roar_vio_read(s0, buf, len)) <= 0 ) 
     98  if ( (miclen = roar_vio_read(s0, micbuf, len)) <= 0 ) 
    6999   break; 
    70   if ( roar_vio_write(s1, buf, l) != l ) 
     100  if ( roar_vio_write(s1, micbuf, miclen) != miclen ) 
    71101   break; 
    72   if ( (l = roar_vio_read(s1, buf, len)) <= 0 ) 
     102  if ( (outlen = roar_vio_read(s1, outbuf, len)) <= 0 ) 
    73103   break; 
    74   if ( roar_vio_write(s0, buf, l) != l ) 
     104 
     105  if ( g_conf.antiecho != AE_NONE ) 
     106   anti_echo16(outbuf, micbuf, ROAR_MIN(miclen, outlen)/2); 
     107 
     108  if ( roar_vio_write(s0, outbuf, outlen) != outlen ) 
    75109   break; 
    76110 } 
    77111 
    78  free(buf); 
     112 free(outbuf); 
    79113 
    80114 return 0; 
     
    93127 char * k; 
    94128 int    i; 
     129 
     130 memset(&g_conf, 0, sizeof(g_conf)); 
     131 
     132 g_conf.antiecho = AE_SIMPLE; 
    95133 
    96134 for (i = 1; i < argc; i++) { 
     
    130168 } 
    131169 
    132  run_stream(&svio, &dvio, &info); 
     170 run_stream(&dvio, &svio, &info); 
    133171 
    134172 roar_vio_close(&svio); 
Note: See TracChangeset for help on using the changeset viewer.