Changeset 1012:e0923fe24fa9 in roaraudio
- Timestamp:
- 12/20/08 22:48:23 (15 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- roard
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/codecfilter.c
r998 r1012 28 28 {-1, "null", "null codec filter", NULL, ROAR_CODECFILTER_NONE, NULL, NULL, NULL, NULL, NULL, NULL}, 29 29 30 /* 30 31 #ifdef ROAR_HAVE_LIBSNDFILE 31 {ROAR_CODEC_RIFF_WAVE, "sndfile", "libsndfile codec filter", NULL, ROAR_CODECFILTER_READ, 32 cf_sndfile_open, cf_sndfile_close, NULL, NULL, cf_sndfile_read, NULL}, 33 #else 32 {ROAR_CODEC_RIFF_WAVE, "sndfile", "libsndfile codec filter", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 33 cf_sndfile_open, cf_sndfile_close, NULL, cf_sndfile_write, cf_sndfile_read, NULL}, 34 #else 35 */ 34 36 {ROAR_CODEC_RIFF_WAVE, "RIFF/WAVE", "RIFF/WAVE", NULL, ROAR_CODECFILTER_READ, 35 cf_wave_open, cf_wave_close, NULL, NULL, cf_wave_read, NULL},36 #endif37 cf_wave_open, cf_wave_close, NULL, cf_wave_write, cf_wave_read, NULL}, 38 //#endif 37 39 38 40 {ROAR_CODEC_ALAW, "alaw", "A-Law", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, -
roard/codecfilter_sndfile.c
r928 r1012 39 39 obj->stream = info; 40 40 41 ROAR_STREAM(info)->info.codec = ROAR_CODEC_DEFAULT; 42 41 43 *inst = (CODECFILTER_USERDATA_T) obj; 42 44 … … 45 47 s->info.codec = ROAR_CODEC_DEFAULT; 46 48 */ 49 50 ROAR_WARN("cf_sndfile_open(*) = 0"); 47 51 48 52 return 0; … … 85 89 return -1; 86 90 } 91 ROAR_WARN("cf_sndfile_read(*): obj->info={.format=0x%.8x, .samplerate=%i, .channels=%i}", obj->info.format, obj->info.samplerate, obj->info.channels); 87 92 88 93 s->info.codec = ROAR_CODEC_DEFAULT; … … 106 111 107 112 int cf_sndfile_write(CODECFILTER_USERDATA_T inst, char * buf, int len) { 108 return -1; 113 struct codecfilter_sndfile_inst * obj = (struct codecfilter_sndfile_inst *) inst; 114 struct roar_stream * s = ROAR_STREAM(obj->stream); 115 int ret; 116 117 ROAR_WARN("cf_sndfile_write(*): obj->opened=%i", obj->opened); 118 119 if ( !obj->opened ) { 120 if ( s->fh == -1 ) { 121 errno = EAGAIN; 122 return -1; 123 } 124 125 switch (s->info.codec) { 126 case ROAR_CODEC_PCM_S_LE: 127 case ROAR_CODEC_PCM_S_BE: 128 switch (s->info.bits) { 129 case 8: 130 obj->info.format = SF_FORMAT_PCM_S8; 131 break; 132 case 16: 133 obj->info.format = SF_FORMAT_PCM_16; 134 break; 135 case 24: 136 obj->info.format = SF_FORMAT_PCM_24; 137 break; 138 case 32: 139 obj->info.format = SF_FORMAT_PCM_32; 140 break; 141 } 142 //obj->info.format |= s->info.codec == ROAR_CODEC_PCM_S_LE ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG; 143 obj->info.format |= SF_ENDIAN_FILE; 144 obj->info.format |= SF_FORMAT_WAV; 145 break; 146 default: 147 ROAR_ERR("cf_sndfile_write(*): codec(%s) not supported!", roar_codec2str(s->info.bits)); 148 return -1; 149 break; 150 } 151 152 obj->info.samplerate = s->info.rate; 153 obj->info.channels = s->info.channels; 154 obj->info.sections = 1; 155 obj->info.frames = 182592; // 2147483647; 156 obj->info.seekable = 1; 157 obj->info.format = 0x00010002; 158 159 if ( (obj->state = sf_open_fd(s->fh, SFM_WRITE, &(obj->info), 0)) == NULL ) { 160 ROAR_ERR("cf_sndfile_write(*): can not sf_open_fd(*)!"); 161 ROAR_ERR("cf_sndfile_write(*): s->fh=%i", s->fh); 162 ROAR_ERR("cf_sndfile_write(*): obj->info={.format=0x%.8x, .samplerate=%i, .channels=%i}", obj->info.format, obj->info.samplerate, obj->info.channels); 163 return -1; 164 } 165 166 obj->opened = 1; 167 // errno = EAGAIN; 168 } 169 170 ROAR_WARN("cf_sndfile_write(*): obj->opened=%i", obj->opened); 171 ret = sf_write_raw(obj->state, (void*) buf, len); 172 ROAR_WARN("cf_sndfile_write(inst=%p, buf=%p, len=%i) = %i", inst, buf, len, ret); 173 return ret; 109 174 } 110 175 -
roard/codecfilter_wave.c
r668 r1012 83 83 int cf_wave_write(CODECFILTER_USERDATA_T inst, char * buf, int len) { 84 84 struct codecfilter_wave_inst * self = (struct codecfilter_wave_inst *) inst; 85 struct roar_stream * s = ROAR_STREAM(self->stream); 86 char header[44]; 87 int32_t tmp32; 88 int16_t tmp16; 89 int16_t bits; 90 int16_t codec; 85 91 86 return 0; 92 ROAR_WARN("cf_wave_write(inst=%p, buf=%p, len=%i) = ?", inst, buf, len); 93 ROAR_WARN("cf_wave_write(inst=%p, buf=%p, len=%i): self->opened=%i", inst, buf, len, self->opened); 94 95 if ( self->opened ) { 96 return stream_vio_s_write(self->stream, buf, len); 97 } else { 98 99 if ( s->fh == -1 ) { 100 errno = EAGAIN; 101 return -1; 102 } 103 104 memcpy(header , "RIFF\367\377\377\177WAVEfmt \020", 17); 105 memcpy(header+36, "data\313\377\377\177", 8); 106 107 switch (s->info.codec) { 108 case ROAR_CODEC_PCM_S_LE: 109 codec = 0x0001; 110 break; 111 default: 112 ROAR_ERR("cf_wave_write(*) Codec not supported!"); 113 return -1; 114 break; 115 } 116 117 ROAR_WARN("cf_wave_write(*) Codec supported!"); 118 119 bits = s->info.bits; 120 memcpy(header+24, &(s->info.rate ), 4); 121 memcpy(header+22, &(s->info.channels), 2); 122 memcpy(header+34, &bits, 2); 123 124 tmp16 = s->info.channels * bits / 8; 125 memcpy(header+32, &tmp16, 2); 126 tmp32 = tmp16 * s->info.rate; 127 memcpy(header+28, &tmp32, 4); 128 memcpy(header+20, &codec, 2); 129 130 if ( stream_vio_s_write(self->stream, header, 44) != 44 ) 131 return -1; 132 133 self->opened = 1; 134 135 errno = EAGAIN; 136 // return -1; 137 138 len = stream_vio_s_write(self->stream, buf, len); 139 140 cf_wave_close(inst); 141 ROAR_STREAM_SERVER(s)->codecfilter = -1; 142 143 return len; 144 145 // return stream_vio_s_write(self->stream, buf, len); 146 } 147 148 return -1; 87 149 } 88 150 -
roard/streams.c
r981 r1012 738 738 } 739 739 } else { 740 errno = 0; 740 741 if ( codecfilter_write(ss->codecfilter_inst, ss->codecfilter, obuf, olen) 741 742 == olen ) { … … 744 745 return 0; 745 746 } else { // we cann't retry on codec filetered streams 746 if ( need_to_free ) free(obuf); 747 streams_delete(id); 748 return -1; 747 if ( errno != EAGAIN ) { 748 if ( need_to_free ) free(obuf); 749 streams_delete(id); 750 return -1; 751 } 749 752 } 750 753 }
Note: See TracChangeset
for help on using the changeset viewer.