Changeset 2637:38fc8e7a38c9 in roaraudio
- Timestamp:
- 09/12/09 01:44:00 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroardsp/transcode.c
r2311 r2637 147 147 148 148 int roar_xcoder_proc (struct roar_xcoder * state, void * buf, size_t len) { 149 return -1; 149 struct roar_buffer_stats ringstats; 150 struct roar_buffer * bufbuf; 151 void * bufdata; 152 size_t curlen; 153 154 if ( state == NULL ) 155 return -1; 156 157 if ( buf == NULL && len != 0 ) 158 return -1; 159 160 if ( state->packet_len == -1 ) 161 if ( roar_xcoder_packet_size(state, -1) == -1 ) 162 return -1; 163 164 if ( state->packet_len == 0 ) 165 return roar_xcoder_proc_packet(state, buf, len); 166 167 if ( state->iobuffer == NULL ) { 168 while ( len >= state->packet_len ) { 169 if ( roar_xcoder_proc_packet(state, buf, state->packet_len) == -1 ) 170 return -1; 171 172 buf += state->packet_len; 173 len -= state->packet_len; 174 } 175 176 if ( !len ) 177 return 0; 178 179 if ( state->encode ) { 180 curlen = len; 181 } else { 182 curlen = state->packet_len; 183 } 184 185 if ( roar_buffer_new(&bufbuf, curlen) == -1 ) 186 return -1; 187 188 if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 189 roar_buffer_free(bufbuf); 190 return -1; 191 } 192 193 if ( state->encode ) { 194 memcpy(bufdata, buf, len); 195 } else { 196 if ( roar_xcoder_proc_packet(state, bufdata, state->packet_len) == -1 ) { 197 roar_buffer_free(bufbuf); 198 return -1; 199 } 200 201 curlen = len; 202 203 if ( roar_buffer_shift_out(&bufbuf, buf, &curlen) == -1 ) { 204 roar_buffer_free(bufbuf); 205 return -1; 206 } 207 208 if ( curlen < len ) { // this should never happen! 209 roar_buffer_free(bufbuf); 210 return -1; 211 } 212 } 213 214 state->iobuffer = bufbuf; 215 } else { 216 if ( state->encode ) { 217 if ( roar_buffer_new(&bufbuf, len) == -1 ) 218 return -1; 219 220 if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 221 roar_buffer_free(bufbuf); 222 return -1; 223 } 224 225 memcpy(bufdata, buf, len); 226 227 if ( roar_buffer_add(state->iobuffer, bufbuf) == -1 ) { 228 roar_buffer_free(bufbuf); 229 return -1; 230 } 231 232 if ( roar_buffer_ring_stats(state->iobuffer, &ringstats) == -1 ) 233 return -1; 234 235 if ( roar_buffer_new(&bufbuf, state->packet_len) == -1 ) 236 return -1; 237 238 if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 239 roar_buffer_free(bufbuf); 240 return -1; 241 } 242 243 while ( ringstats.bytes > state->packet_len ) { 244 curlen = state->packet_len; 245 if ( roar_buffer_shift_out(&(state->iobuffer), bufdata, &curlen) == -1 ) { 246 roar_buffer_free(bufbuf); 247 return -1; 248 } 249 250 if ( curlen < state->packet_len ) { // this should not happen... 251 roar_buffer_free(bufbuf); 252 return -1; 253 } 254 255 if ( roar_xcoder_proc_packet(state, bufdata, state->packet_len) == -1 ) { 256 roar_buffer_free(bufbuf); 257 return -1; 258 } 259 260 if ( roar_buffer_ring_stats(state->iobuffer, &ringstats) == -1 ) { 261 roar_buffer_free(bufbuf); 262 return -1; 263 } 264 } 265 266 if ( roar_buffer_free(bufbuf) == -1 ) 267 return -1; 268 } else { 269 curlen = len; 270 271 if ( roar_buffer_shift_out(&(state->iobuffer), buf, &curlen) == -1 ) { 272 return -1; 273 } 274 275 if ( curlen == len ) 276 return -1; 277 278 // we now have curlen < len and state->iobuffer == NULL 279 // as no data is left in the buffer, need to get some new data. 280 // we simply call ourself to get some more data... 281 282 if ( state->iobuffer == NULL ) { 283 ROAR_WARN("roar_xcoder_proc(state=%p, buf=%p, len=%lu): iobuffer != NULL, " 284 "This is a bug in libroar{dsp,} or some hardware is broken", 285 state, buf, (unsigned long)len); 286 return -1; 287 } 288 289 len -= curlen; 290 buf += curlen; 291 292 return roar_xcoder_proc(state, buf, len); 293 } 294 } 295 296 return 0; 150 297 } 151 298
Note: See TracChangeset
for help on using the changeset viewer.