Changeset 617:eadc4ce98867 in roaraudio
- Timestamp:
- 08/20/08 02:00:51 (16 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- roard
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/codecfilter_speex.c
r616 r617 24 24 self->i_rest = NULL; 25 25 self->fi_rest = 0; 26 self->o_rest = NULL; 27 self->fo_rest = 0; 26 28 27 29 speex_bits_init(&(self->bits)); … … 195 197 uint16_t mode = ROAR_SPEEX_MODE_UWB; 196 198 int tmp; 199 int fs2; 200 int ret = 0; 201 int need_extra; 197 202 198 203 if ( ! self->encoder ) { … … 217 222 speex_encoder_ctl(self->encoder, SPEEX_GET_FRAME_SIZE, &(self->frame_size)); 218 223 219 } 220 221 return -1; 224 fs2 = self->frame_size * 2; 225 226 if ( !self->cd ) { 227 self->cd = malloc(fs2); 228 if ( !self->cd ) 229 return 0; 230 } 231 232 if ( !self->o_rest ) { 233 self->o_rest = malloc(fs2); 234 if ( !self->o_rest ) 235 return 0; 236 } 237 } 238 239 fs2 = self->frame_size * 2; 240 241 if ( self->fo_rest ) { // ignore the rest for the moment 242 if ( (self->fo_rest + len) > fs2 ) { 243 need_extra = fs2 - self->fo_rest; 244 memcpy(self->o_rest + self->fo_rest, buf, need_extra); 245 246 speex_bits_reset(&(self->bits)); 247 248 speex_encode_int(self->encoder, (spx_int16_t *) self->o_rest, &(self->bits)); 249 250 mode = speex_bits_write(&(self->bits), self->cd, fs2); 251 252 tmp = mode = ROAR_HOST2NET16(mode); 253 stream_vio_s_write(self->stream, &mode, 2); 254 if ( stream_vio_s_write(self->stream, self->cd, tmp) != tmp ) 255 return -1; 256 257 buf += need_extra; 258 ret += need_extra; 259 len -= need_extra; 260 self->fo_rest = 0; 261 } else { // just add the data to o_rest 262 memcpy(self->o_rest + self->fo_rest, buf, len); 263 self->fo_rest += len; 264 return len; 265 } 266 } 267 268 // TODO: do we realy need such a loop? 269 while (len > fs2) { 270 ROAR_WARN("cf_speex_write(*): Discarding a full block of data as non-o_rest encoding is not supported!"); 271 len -= fs2; 272 buf += fs2; 273 ret += fs2; 274 } 275 276 if ( len ) { // we still have some data, add this to o_rest 277 memcpy(self->o_rest, buf, len); 278 self->fo_rest = len; 279 ret += len; 280 } 281 282 return ret; 222 283 } 223 284 -
roard/include/codecfilter_speex.h
r396 r617 18 18 void * i_rest; /* rest... */ 19 19 int fi_rest; 20 char * o_rest; 21 int fo_rest; /* how much is in rest? */ 20 22 21 23 /* … … 24 26 int out_size; 25 27 char * i_rest; 26 char * o_rest;27 28 int s_buf; 28 29 int fi_rest; /-* how much is in rest? *-/ 29 int fo_rest; /-* how much is in rest? *-/30 30 */ 31 31 };
Note: See TracChangeset
for help on using the changeset viewer.