Changeset 2308:44151407644f in roaraudio


Ignore:
Timestamp:
08/05/09 15:09:27 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote stereo support for decoder end

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/codecfilter_speex.c

    r668 r2308  
    3838*/ 
    3939 
     40#define _FS (_16BIT * (self->stereo ? 2 : 1)) 
     41 
    4042int cf_speex_open(CODECFILTER_USERDATA_T * inst, int codec, 
    4143                                            struct roar_stream_server * info, 
     
    4951  return -1; 
    5052 
     53 s->info.codec    = ROAR_CODEC_DEFAULT; 
     54 s->info.bits     = 16; // speex hardcoded 
     55 
     56 switch (s->info.channels) { 
     57  case 1: self->stereo = 0; break; 
     58  case 2: self->stereo = 1; break; 
     59  default: 
     60    free(self); 
     61    return -1; 
     62 } 
     63 
     64 // do as much to preper the startup of stereo encoder as possible 
     65 if ( self->stereo ) { 
     66  self->stereo_callback.callback_id = SPEEX_INBAND_STEREO; 
     67  self->stereo_callback.func        = speex_std_stereo_request_handler; 
     68  self->stereo_callback.data       = &(self->stereo_state); 
     69 } 
     70 
    5171 self->encoder = NULL; 
    5272 self->decoder = NULL; 
     
    6282 
    6383 speex_bits_init(&(self->bits)); 
    64  
    65  s->info.codec    = ROAR_CODEC_DEFAULT; 
    66  s->info.bits     = 16; // speex hardcoded 
    67  s->info.channels =  1; // only mono support at the moment 
    6884 
    6985 *inst = (void*) self; 
     
    106122 uint16_t ui; 
    107123 int tmp; 
    108  int still_todo = len / 2 /* 16 bit */; 
     124 int still_todo = len / _FS; 
    109125 int ret = 0; 
    110  int fs2; // = self->frame_size * 2; 
     126 int fs2; // = self->frame_size * _16BIT * channels; 
    111127 char magic[ROAR_SPEEX_MAGIC_LEN]; 
     128 SpeexStereoState stereo = SPEEX_STEREO_STATE_INIT; 
    112129 
    113130 ROAR_DBG("cf_speex_read(inst=%p, buf=%p, len=%i) = ?", inst, buf, len); 
     
    140157  speex_decoder_ctl(self->decoder, SPEEX_SET_ENH, &tmp); 
    141158 
     159  if ( self->stereo ) { 
     160   memcpy(&(self->stereo_state), &stereo, sizeof(self->stereo_state)); 
     161   speex_decoder_ctl(self->decoder, SPEEX_SET_HANDLER, &(self->stereo_callback)); 
     162  } 
     163 
     164 
    142165  speex_decoder_ctl(self->decoder, SPEEX_GET_FRAME_SIZE, &(self->frame_size)); 
    143166 
    144   fs2 = self->frame_size * 2; 
     167  fs2 = self->frame_size * _FS; 
    145168 
    146169  ROAR_DBG("cf_speex_read(*): frame_size=%i (%i bytes)", self->frame_size, fs2); 
     
    158181  } 
    159182 } 
    160  fs2 = self->frame_size * 2; 
     183 fs2 = self->frame_size * _FS; 
    161184 
    162185 ROAR_DBG("cf_speex_read(*): Have a working decoder!"); 
     
    167190 
    168191 if ( self->fi_rest ) { 
    169   if ( self->fi_rest > (still_todo*2) ) { 
     192  if ( self->fi_rest > (still_todo*_FS) ) { 
    170193   ROAR_DBG("cf_speex_read(*): using data from input rest buffer: len=%i (no need to read new data)", self->fi_rest); 
    171    still_todo *= 2; // we will set this to zero one way or another, 
    172                     // so we don't need to care about soring a 'warong' value here. 
     194   still_todo *= _FS; // we will set this to zero one way or another, 
     195                         // so we don't need to care about soring a 'wrong' value here. 
    173196   memcpy(buf, self->i_rest, still_todo); 
    174197   memmove(self->i_rest, self->i_rest + still_todo, self->fi_rest - still_todo); 
     
    180203   memcpy(buf, self->i_rest, self->fi_rest); 
    181204   buf += self->fi_rest; 
    182    still_todo -= self->fi_rest/2; 
     205   still_todo -= self->fi_rest/_FS; 
    183206   ret += self->fi_rest; 
    184207   self->fi_rest = 0; 
     
    203226  speex_decode_int(self->decoder, &(self->bits), self->cd); 
    204227 
     228  if ( self->stereo) { 
     229   speex_decode_stereo_int(self->cd, self->frame_size, &(self->stereo_state)); 
     230  } 
     231 
    205232  if ( self->frame_size > still_todo ) { 
    206    memcpy(buf, self->cd, still_todo*2); 
    207    ret += still_todo*2; 
    208    self->fi_rest = (self->frame_size - still_todo)*2; 
    209    ROAR_DBG("cf_speex_read(*): self->fi_rest=%i, off=%i", self->fi_rest, still_todo*2); 
    210    memcpy(self->i_rest, (self->cd)+(still_todo*2), self->fi_rest); 
     233   memcpy(buf, self->cd, still_todo*_FS); 
     234   ret += still_todo*_FS; 
     235   self->fi_rest = (self->frame_size - still_todo)*_FS; 
     236   ROAR_DBG("cf_speex_read(*): self->fi_rest=%i, off=%i", self->fi_rest, still_todo*_FS); 
     237   memcpy(self->i_rest, (self->cd)+(still_todo*_FS), self->fi_rest); 
    211238   still_todo = 0; 
    212239  } else { 
     
    219246 
    220247 if ( still_todo ) { 
    221   ROAR_DBG("cf_speex_read(*): could not read all reqquested data, returning %i byte less", still_todo*2); 
     248  ROAR_DBG("cf_speex_read(*): could not read all reqquested data, returning %i byte less", still_todo*_FS); 
    222249 } 
    223250 
Note: See TracChangeset for help on using the changeset viewer.