Changeset 1144:a17ed9fd2af0 in roaraudio


Ignore:
Timestamp:
01/21/09 22:56:24 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support to some codec filters to calc the codec delay

Location:
roard
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • roard/codecfilter.c

    r1065 r1144  
    2626 
    2727struct roar_codecfilter g_codecfilter[] = { 
    28  {-1,                     "null", "null codec filter", NULL, ROAR_CODECFILTER_NONE, NULL, NULL, NULL, NULL, NULL, NULL}, 
     28 {-1,                     "null", "null codec filter", NULL, ROAR_CODECFILTER_NONE, 
     29                                          NULL, NULL, NULL, NULL, NULL, NULL, NULL}, 
    2930 
    3031/* 
     
    3536*/ 
    3637 {ROAR_CODEC_RIFF_WAVE, "RIFF/WAVE", "RIFF/WAVE", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 
    37   cf_wave_open, cf_wave_close, NULL, cf_wave_write, cf_wave_read, NULL}, 
     38  cf_wave_open, cf_wave_close, NULL, cf_wave_write, cf_wave_read, NULL, NULL}, 
    3839//#endif 
    3940 
     
    5152  NULL, 
    5253#endif 
    53   cf_alaw_read, NULL}, 
     54  cf_alaw_read, NULL, cf_alaw_delay}, 
    5455#endif 
    5556 
     
    6768  NULL, 
    6869#endif 
    69   cf_mulaw_read, NULL}, 
     70  cf_mulaw_read, NULL, cf_alaw_delay}, 
    7071#endif 
    7172 
     
    7374 {ROAR_CODEC_OGG_GENERAL, "cmd",  "ogg123", 
    7475  ROAR_HAVE_BIN_OGG123 " -q -d raw -f - -", ROAR_CODECFILTER_READ, 
    75   cf_cmd_open, NULL, NULL, NULL, NULL, NULL}, 
     76  cf_cmd_open, NULL, NULL, NULL, NULL, NULL, codecfilter_delay_fulldyn}, 
    7677#endif 
    7778 
     
    8384 ROAR_CODECFILTER_READ, 
    8485#endif 
    85  cf_vorbis_open, cf_vorbis_close, NULL, cf_vorbis_write, cf_vorbis_read, NULL}, 
     86 cf_vorbis_open, cf_vorbis_close, NULL, cf_vorbis_write, cf_vorbis_read, NULL, codecfilter_delay_fulldyn}, 
    8687#else 
    8788#ifdef ROAR_HAVE_BIN_OGG123 
    8889 {ROAR_CODEC_OGG_VORBIS, "cmd",  "ogg123", 
    8990  ROAR_HAVE_BIN_OGG123 " -q -d raw -f - -", ROAR_CODECFILTER_READ, 
    90   cf_cmd_open, NULL, NULL, NULL, NULL, NULL}, 
     91  cf_cmd_open, NULL, NULL, NULL, NULL, NULL, codecfilter_delay_fulldyn}, 
    9192#endif 
    9293#endif 
     
    9596 {ROAR_CODEC_OGG_SPEEX, "fishsound",  "libfishsound Xiph Codec library", 
    9697  NULL, ROAR_CODECFILTER_READ, 
    97   cf_fishsound_open, cf_fishsound_close, NULL, NULL, cf_fishsound_read, NULL}, 
     98  cf_fishsound_open, cf_fishsound_close, NULL, NULL, cf_fishsound_read, NULL, codecfilter_delay_fulldyn}, 
    9899 
    99100 {ROAR_CODEC_OGG_FLAC, "fishsound",  "libfishsound Xiph Codec library", 
    100101  NULL, ROAR_CODECFILTER_READ, 
    101   cf_fishsound_open, cf_fishsound_close, NULL, NULL, cf_fishsound_read, NULL}, 
     102  cf_fishsound_open, cf_fishsound_close, NULL, NULL, cf_fishsound_read, NULL, codecfilter_delay_fulldyn}, 
    102103#endif 
    103104 
     
    105106 {ROAR_CODEC_MIDI_FILE, "MIDIFILE", "timidity MIDI synth", 
    106107  ROAR_HAVE_BIN_TIMIDITY " -Or1sl -s %R -o - -", ROAR_CODECFILTER_READ, 
    107   cf_cmd_open, NULL, NULL, NULL, NULL, NULL}, 
     108  cf_cmd_open, NULL, NULL, NULL, NULL, NULL, codecfilter_delay_fulldyn}, 
    108109#endif 
    109110 
    110111#ifdef ROAR_HAVE_LIBCELT 
    111112 {ROAR_CODEC_ROAR_CELT, "RoarCELT", "RoarAudio CELT", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 
    112   cf_celt_open, cf_celt_close, NULL, cf_celt_write, cf_celt_read, NULL}, 
     113  cf_celt_open, cf_celt_close, NULL, cf_celt_write, cf_celt_read, NULL, cf_celt_delay}, 
    113114#endif 
    114115 
    115116#ifdef ROAR_HAVE_LIBSPEEX 
    116117 {ROAR_CODEC_ROAR_SPEEX, "RoarSpeex", "RoarAudio Speex", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 
    117   cf_speex_open, cf_speex_close, NULL, cf_speex_write, cf_speex_read, NULL}, 
     118  cf_speex_open, cf_speex_close, NULL, cf_speex_write, cf_speex_read, NULL, NULL}, 
    118119#endif 
    119120 
     
    128129#endif 
    129130  ROAR_CODECFILTER_READ, 
    130   cf_cmd_open, NULL, NULL, NULL, NULL, NULL}, 
    131 #endif 
    132  
    133  {-1, NULL, NULL, NULL, ROAR_CODECFILTER_NONE, NULL, NULL, NULL, NULL, NULL, NULL} // end of list 
     131  cf_cmd_open, NULL, NULL, NULL, NULL, NULL, codecfilter_delay_fulldyn}, 
     132#endif 
     133 
     134 {-1, NULL, NULL, NULL, ROAR_CODECFILTER_NONE, NULL, NULL, NULL, NULL, NULL, NULL, NULL} // end of list 
    134135}; 
    135136 
     
    138139 int flags; 
    139140 char mode[5]; 
    140  
    141  printf("  Codec        Filtername   Mode - Description\n"); 
     141 char delay[6]; 
     142 uint_least32_t d; 
     143 
     144 printf("  Codec        Filtername   Mode Delay - Description\n"); 
    142145 printf("------------------------------------------------------\n"); 
    143146 
     
    154157    mode[1] = 'w'; 
    155158  } 
     159 
     160  *delay = 0; 
     161  if ( g_codecfilter[i].codec == -1 ) { // null codec filter 
     162   strcpy(delay, "0ms"); 
     163  } else if ( g_codecfilter[i].delay == NULL ) { 
     164   strcpy(delay, "?"); 
     165  } else { 
     166   if ( codecfilter_delay(NULL, i, &d) == -1 ) { 
     167    strcpy(delay, "dyn"); 
     168   } else { 
     169    snprintf(delay, 5, "%ims", d/1000); 
     170   } 
     171  } 
    156172  
    157   printf("  %-12s %-12s %-4s - %s\n", 
     173  printf("  %-12s %-12s %-4s %-5s - %s\n", 
    158174             roar_codec2str(g_codecfilter[i].codec), 
    159175             g_codecfilter[i].name, 
    160176             mode, 
     177             delay, 
    161178             g_codecfilter[i].desc 
    162179             ); 
     
    253270} 
    254271 
     272int codecfilter_delay(CODECFILTER_USERDATA_T   inst, int codecfilter, uint_least32_t * delay) { 
     273 ROAR_DBG("codecfilter_delay(inst=%p, codecfilter=%i, *delay=?) = ?", inst, codecfilter); 
     274 
     275 if ( codecfilter == -1 ) 
     276  return -1; 
     277 
     278 if ( g_codecfilter[codecfilter].delay ) 
     279  return g_codecfilter[codecfilter].delay(inst, delay); 
     280 
     281 return -1; 
     282} 
     283 
     284int codecfilter_delay_fulldyn(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay) { 
     285 *delay = 0; // just to be sure 
     286 return -1; 
     287} 
     288 
    255289//ll 
  • roard/codecfilter_alaw.c

    r1065 r1144  
    8787#endif 
    8888 
     89#if defined(ROAR_SUPPORT_ALAW) || defined(ROAR_SUPPORT_MULAW) 
     90int cf_alaw_delay(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay) { 
     91 // this codec does not create any addition latency. 
     92 
     93 *delay = 0; 
     94 return 0; 
     95} 
     96#endif 
     97 
    8998//ll 
  • roard/codecfilter_celt.c

    r967 r1144  
    266266} 
    267267 
     268int cf_celt_delay(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay) { 
     269 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst; 
     270 
     271 ROAR_DBG("cf_celt_delay(*) = ?"); 
     272 
     273 if ( self == NULL ) { 
     274  *delay = (1000000 * 256) / ROAR_RATE_DEFAULT; 
     275  return 0; 
     276 } else { 
     277  *delay = (1000000 * self->frame_size) / ROAR_STREAM(self->stream)->info.rate; 
     278  ROAR_DBG("cf_celt_delay(*): frame_size=%i, rate=%i, *delay=%i", 
     279                  self->frame_size, ROAR_STREAM(self->stream)->info.rate, *delay); 
     280  return 0; 
     281 } 
     282 
     283 return -1; 
     284} 
     285 
    268286#endif 
    269287//ll 
  • roard/include/codecfilter.h

    r992 r1144  
    5050 int (*read )(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    5151 int (*flush)(CODECFILTER_USERDATA_T   inst); 
     52 int (*delay)(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay); 
    5253}; 
    5354 
     
    9091int codecfilter_read (CODECFILTER_USERDATA_T   inst, int codecfilter, char * buf, int len); 
    9192int codecfilter_flush(CODECFILTER_USERDATA_T   inst, int codecfilter); 
     93int codecfilter_delay(CODECFILTER_USERDATA_T   inst, int codecfilter, uint_least32_t * delay); 
     94 
     95int codecfilter_delay_fulldyn(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay); 
     96 
    9297 
    9398// codecfilter without a own .h: 
     
    100105int cf_alaw_read(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    101106int cf_alaw_write(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
     107int cf_alaw_delay(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay); 
    102108 
    103109int cf_mulaw_open(CODECFILTER_USERDATA_T * inst, int codec, 
     
    109115int cf_mulaw_read(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    110116int cf_mulaw_write(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    111  
     117// cf_mulaw_delay() would be exactly the same as cf_alaw_delay() so it is just used by mulaw, too. 
    112118 
    113119#endif 
  • roard/include/codecfilter_celt.h

    r668 r1144  
    6060int cf_celt_write(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    6161 
     62int cf_celt_delay(CODECFILTER_USERDATA_T   inst, uint_least32_t * delay); 
     63 
    6264#endif 
    6365 
Note: See TracChangeset for help on using the changeset viewer.