Changeset 569:b35e761f50f4 in roaraudio for roard/codecfilter_vorbis.c
- Timestamp:
- 08/19/08 01:13:03 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/codecfilter_vorbis.c
r541 r569 9 9 struct roar_codecfilter * filter) { 10 10 struct codecfilter_vorbis_inst * self = malloc(sizeof(struct codecfilter_vorbis_inst)); 11 struct roar_stream * s = ROAR_STREAM(info); 12 ogg_packet header; 13 ogg_packet header_comm; 14 ogg_packet header_code; 11 15 12 16 if ( !self ) … … 19 23 self->stream = info; 20 24 // self->outlen = ROAR_OUTPUT_BUFFER_SAMPLES * s->info.channels * s->info.bits / 8; // optimal size 25 #ifdef ROAR_HAVE_LIBVORBISENC 26 self->encoding = 0; 27 #endif 21 28 22 29 ROAR_DBG("cf_vorbis_open(*): info->id=%i", ROAR_STREAM(info)->id); 23 30 24 if ( (self->in = fdopen( ((struct roar_stream*)info)->fh, "r")) == NULL ) {31 if ( (self->in = fdopen(s->fh, "r")) == NULL ) { 25 32 free((void*)self); 26 33 return -1; … … 29 36 *inst = (CODECFILTER_USERDATA_T) self; 30 37 31 ((struct roar_stream*)info)->info.codec = ROAR_CODEC_DEFAULT; 38 s->info.codec = ROAR_CODEC_DEFAULT; 39 s->info.bits = 16; 40 41 if ( s->dir == ROAR_DIR_PLAY ) { 42 return 0; 43 } else if ( s->dir == ROAR_DIR_MONITOR ) { 44 #ifdef ROAR_HAVE_LIBVORBISENC 45 // set up the encoder here 46 47 memset(&(self->encoder), 0, sizeof(self->encoder)); 48 49 self->encoding = 1; 50 51 vorbis_info_init(&(self->encoder.vi)); 52 vorbis_comment_init(&(self->encoder.vc)); 53 vorbis_comment_add_tag(&(self->encoder.vc), "SERVER", "RoarAudio"); 54 vorbis_comment_add_tag(&(self->encoder.vc), "ENCODER", "RoarAudio Vorbis codecfilter"); 55 56 if( vorbis_encode_init_vbr(&(self->encoder.vi), (long) s->info.channels, (long) s->info.rate, 57 self->encoder.v_base_quality) != 0 ) { 58 ROAR_ERR("cf_vorbis_open(*): Can not vorbis_encode_init_vbr(*)!"); 59 vorbis_info_clear(&(self->encoder.vi)); // TODO: do we need to free vc also? 60 free(self); 61 return -1; 62 } 63 64 vorbis_analysis_init(&(self->encoder.vd), &(self->encoder.vi)); 65 vorbis_block_init(&(self->encoder.vd), &(self->encoder.vb)); 66 67 // "RA"<<16 + PID<<8 + Stream ID 68 ogg_stream_init(&(self->encoder.os), 0x52410000 + ((getpid() & 0xff)<<8) + s->id); 69 70 vorbis_analysis_headerout(&(self->encoder.vd), &(self->encoder.vc), &header, &header_comm, &header_code); 71 72 ogg_stream_packetin(&(self->encoder.os), &header); 73 ogg_stream_packetin(&(self->encoder.os), &header_comm); 74 ogg_stream_packetin(&(self->encoder.os), &header_code); 75 76 while (ogg_stream_flush(&(self->encoder.os), &(self->encoder.og))) { 77 if ( write(s->fh, self->encoder.og.header, self->encoder.og.header_len) != self->encoder.og.header_len || 78 write(s->fh, self->encoder.og.body, self->encoder.og.body_len ) != self->encoder.og.body_len ) { 79 free(self); // TODO: do we need adtional cleanup? 80 return -1; 81 } 82 } 83 84 #else 85 free(self); 86 return -1; 87 #endif 88 } else { 89 free(self); 90 return -1; 91 } 32 92 33 93 return 0; … … 42 102 if ( self->got_it_running ) 43 103 ov_clear(&(self->vf)); 104 105 #ifdef ROAR_HAVE_LIBVORBISENC 106 if ( self->encoding ) { 107 ogg_stream_clear(&(self->encoder.os)); 108 vorbis_block_clear(&(self->encoder.vb)); 109 vorbis_dsp_clear(&(self->encoder.vd)); 110 vorbis_info_clear(&(self->encoder.vi)); 111 } 112 #endif 44 113 45 114 free(inst);
Note: See TracChangeset
for help on using the changeset viewer.