diff options
Diffstat (limited to 'src/inputPlugins/oggflac_plugin.c')
-rw-r--r-- | src/inputPlugins/oggflac_plugin.c | 307 |
1 files changed, 158 insertions, 149 deletions
diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c index f4e795eba..d1f48bf31 100644 --- a/src/inputPlugins/oggflac_plugin.c +++ b/src/inputPlugins/oggflac_plugin.c @@ -41,8 +41,8 @@ #include <FLAC/metadata.h> static void oggflac_cleanup(InputStream * inStream, - FlacData * data, - OggFLAC__SeekableStreamDecoder * decoder) + FlacData * data, + OggFLAC__SeekableStreamDecoder * decoder) { if (data->replayGainInfo) freeReplayGainInfo(data->replayGainInfo); @@ -51,81 +51,93 @@ static void oggflac_cleanup(InputStream * inStream, closeInputStream(inStream); } -static OggFLAC__SeekableStreamDecoderReadStatus of_read_cb( - const OggFLAC__SeekableStreamDecoder * decoder, - FLAC__byte buf[], unsigned * bytes, void * fdata) { - FlacData * data = (FlacData *) fdata; +static OggFLAC__SeekableStreamDecoderReadStatus of_read_cb(const + OggFLAC__SeekableStreamDecoder + * decoder, + FLAC__byte buf[], + unsigned *bytes, + void *fdata) +{ + FlacData *data = (FlacData *) fdata; size_t r; while (1) { - r = readFromInputStream(data->inStream,(void *)buf,1,*bytes); + r = readFromInputStream(data->inStream, (void *)buf, 1, *bytes); if (r == 0 && !inputStreamAtEOF(data->inStream) && - !data->dc->stop) + !data->dc->stop) my_usleep(10000); else break; } *bytes = r; - + if (r == 0 && !inputStreamAtEOF(data->inStream) && !data->dc->stop) return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; - - return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; + + return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; } -static OggFLAC__SeekableStreamDecoderSeekStatus of_seek_cb( - const OggFLAC__SeekableStreamDecoder * decoder, - FLAC__uint64 offset, void * fdata) +static OggFLAC__SeekableStreamDecoderSeekStatus of_seek_cb(const + OggFLAC__SeekableStreamDecoder + * decoder, + FLAC__uint64 offset, + void *fdata) { - FlacData * data = (FlacData *) fdata; + FlacData *data = (FlacData *) fdata; - if(seekInputStream(data->inStream,offset,SEEK_SET)<0) { - return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; - } + if (seekInputStream(data->inStream, offset, SEEK_SET) < 0) { + return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; + } - return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; + return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; } -static OggFLAC__SeekableStreamDecoderTellStatus of_tell_cb( - const OggFLAC__SeekableStreamDecoder * decoder, - FLAC__uint64 * offset, void * fdata) +static OggFLAC__SeekableStreamDecoderTellStatus of_tell_cb(const + OggFLAC__SeekableStreamDecoder + * decoder, + FLAC__uint64 * + offset, void *fdata) { - FlacData * data = (FlacData *) fdata; + FlacData *data = (FlacData *) fdata; - *offset = (long)(data->inStream->offset); + *offset = (long)(data->inStream->offset); - return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; + return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; } -static OggFLAC__SeekableStreamDecoderLengthStatus of_length_cb( - const OggFLAC__SeekableStreamDecoder * decoder, - FLAC__uint64 * length, void * fdata) +static OggFLAC__SeekableStreamDecoderLengthStatus of_length_cb(const + OggFLAC__SeekableStreamDecoder + * decoder, + FLAC__uint64 * + length, + void *fdata) { - FlacData * data = (FlacData *) fdata; + FlacData *data = (FlacData *) fdata; - *length = (size_t)(data->inStream->size); + *length = (size_t) (data->inStream->size); - return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; + return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; } static FLAC__bool of_EOF_cb(const OggFLAC__SeekableStreamDecoder * decoder, - void * fdata) { - FlacData * data = (FlacData *) fdata; + void *fdata) +{ + FlacData *data = (FlacData *) fdata; if (inputStreamAtEOF(data->inStream) == 1) - return true; + return true; return false; } -static void of_error_cb(const OggFLAC__SeekableStreamDecoder * decoder, - FLAC__StreamDecoderErrorStatus status, void *fdata) +static void of_error_cb(const OggFLAC__SeekableStreamDecoder * decoder, + FLAC__StreamDecoderErrorStatus status, void *fdata) { - flac_error_common_cb("oggflac",status,(FlacData *) fdata); + flac_error_common_cb("oggflac", status, (FlacData *) fdata); } -static void oggflacPrintErroredState(OggFLAC__SeekableStreamDecoderState state) +static void oggflacPrintErroredState(OggFLAC__SeekableStreamDecoderState state) { - switch(state) { + switch (state) { case OggFLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR: ERROR("oggflac allocation error\n"); break; @@ -154,21 +166,23 @@ static void oggflacPrintErroredState(OggFLAC__SeekableStreamDecoderState state) } } -static FLAC__StreamDecoderWriteStatus oggflacWrite( - const OggFLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, const FLAC__int32 * const buf[], - void * vdata) +static FLAC__StreamDecoderWriteStatus oggflacWrite(const + OggFLAC__SeekableStreamDecoder + * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * + const buf[], void *vdata) { - FlacData * data = (FlacData *)vdata; + FlacData *data = (FlacData *) vdata; FLAC__uint32 samples = frame->header.blocksize; FLAC__uint16 u16; - unsigned char * uc; + unsigned char *uc; int c_samp, c_chan, d_samp; int i; float timeChange; - - timeChange = ((float)samples)/frame->header.sample_rate; - data->time+= timeChange; + + timeChange = ((float)samples) / frame->header.sample_rate; + data->time += timeChange; /* ogg123 uses a complicated method of calculating bitrate * with averaging which I'm not too fond of. @@ -177,24 +191,26 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite( * * this does not give an accurate bitrate: * (bytes_last_read was set in the read callback) - data->bitRate = ((8.0 * data->bytes_last_read * - frame->header.sample_rate) - /((float)samples * 1000)) + 0.5; - */ - - for(c_samp = d_samp = 0; c_samp < frame->header.blocksize; c_samp++) { - for(c_chan = 0; c_chan < frame->header.channels; - c_chan++, d_samp++) { + data->bitRate = ((8.0 * data->bytes_last_read * + frame->header.sample_rate) + /((float)samples * 1000)) + 0.5; + */ + + for (c_samp = d_samp = 0; c_samp < frame->header.blocksize; c_samp++) { + for (c_chan = 0; c_chan < frame->header.channels; + c_chan++, d_samp++) { u16 = buf[c_chan][c_samp]; uc = (unsigned char *)&u16; - for(i=0;i<(data->dc->audioFormat.bits/8);i++) { - if(data->chunk_length>=FLAC_CHUNK_SIZE) { - if(flacSendChunk(data)<0) { - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + for (i = 0; i < (data->dc->audioFormat.bits / 8); i++) { + if (data->chunk_length >= FLAC_CHUNK_SIZE) { + if (flacSendChunk(data) < 0) { + return + FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; } data->chunk_length = 0; - if(data->dc->seek) { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + if (data->dc->seek) { + return + FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } } data->chunk[data->chunk_length++] = *(uc++); @@ -206,106 +222,104 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite( } /* used by TagDup */ -static void of_metadata_dup_cb( - const OggFLAC__SeekableStreamDecoder * decoder, - const FLAC__StreamMetadata *block, void *vdata) +static void of_metadata_dup_cb(const OggFLAC__SeekableStreamDecoder * decoder, + const FLAC__StreamMetadata * block, void *vdata) { - FlacData * data = (FlacData *)vdata; + FlacData *data = (FlacData *) vdata; - switch(block->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - if (!data->tag) data->tag = newMpdTag(); + switch (block->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + if (!data->tag) + data->tag = newMpdTag(); data->tag->time = ((float)block->data.stream_info. - total_samples) / - block->data.stream_info.sample_rate + - 0.5; + total_samples) / + block->data.stream_info.sample_rate + 0.5; return; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - copyVorbisCommentBlockToMpdTag(block,data->tag); + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + copyVorbisCommentBlockToMpdTag(block, data->tag); default: break; - } + } } /* used by decode */ static void of_metadata_decode_cb(const OggFLAC__SeekableStreamDecoder * dec, - const FLAC__StreamMetadata *block, void *vdata) + const FLAC__StreamMetadata * block, + void *vdata) { - flac_metadata_common_cb(block, (FlacData *)vdata); + flac_metadata_common_cb(block, (FlacData *) vdata); } -static OggFLAC__SeekableStreamDecoder * full_decoder_init_and_read_metadata( - FlacData * data, - unsigned int metadata_only) +static OggFLAC__SeekableStreamDecoder + *full_decoder_init_and_read_metadata(FlacData * data, + unsigned int metadata_only) { - OggFLAC__SeekableStreamDecoder * decoder = NULL; + OggFLAC__SeekableStreamDecoder *decoder = NULL; unsigned int s = 1; if (!(decoder = OggFLAC__seekable_stream_decoder_new())) return NULL; if (metadata_only) { - s &= OggFLAC__seekable_stream_decoder_set_metadata_callback( - decoder, of_metadata_dup_cb); - s &= OggFLAC__seekable_stream_decoder_set_metadata_respond( - decoder, - FLAC__METADATA_TYPE_STREAMINFO); + s &= OggFLAC__seekable_stream_decoder_set_metadata_callback + (decoder, of_metadata_dup_cb); + s &= OggFLAC__seekable_stream_decoder_set_metadata_respond + (decoder, FLAC__METADATA_TYPE_STREAMINFO); } else { - s &= OggFLAC__seekable_stream_decoder_set_metadata_callback( - decoder, of_metadata_decode_cb); + s &= OggFLAC__seekable_stream_decoder_set_metadata_callback + (decoder, of_metadata_decode_cb); } - + s &= OggFLAC__seekable_stream_decoder_set_read_callback(decoder, - of_read_cb); + of_read_cb); s &= OggFLAC__seekable_stream_decoder_set_seek_callback(decoder, - of_seek_cb); + of_seek_cb); s &= OggFLAC__seekable_stream_decoder_set_tell_callback(decoder, - of_tell_cb); + of_tell_cb); s &= OggFLAC__seekable_stream_decoder_set_length_callback(decoder, - of_length_cb); + of_length_cb); s &= OggFLAC__seekable_stream_decoder_set_eof_callback(decoder, - of_EOF_cb); + of_EOF_cb); s &= OggFLAC__seekable_stream_decoder_set_write_callback(decoder, - oggflacWrite); + oggflacWrite); s &= OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, - FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__METADATA_TYPE_VORBIS_COMMENT); s &= OggFLAC__seekable_stream_decoder_set_error_callback(decoder, - of_error_cb); + of_error_cb); s &= OggFLAC__seekable_stream_decoder_set_client_data(decoder, - (void *)data); + (void *)data); if (!s) { ERROR("oggflac problem before init()\n"); goto fail; } if (OggFLAC__seekable_stream_decoder_init(decoder) != - OggFLAC__SEEKABLE_STREAM_DECODER_OK) - { + OggFLAC__SEEKABLE_STREAM_DECODER_OK) { ERROR("oggflac problem doing init()\n"); goto fail; } - if (!OggFLAC__seekable_stream_decoder_process_until_end_of_metadata( - decoder)) { + if (!OggFLAC__seekable_stream_decoder_process_until_end_of_metadata + (decoder)) { ERROR("oggflac problem reading metadata\n"); goto fail; } - return decoder; + return decoder; -fail: - oggflacPrintErroredState( - OggFLAC__seekable_stream_decoder_get_state(decoder)); + fail: + oggflacPrintErroredState(OggFLAC__seekable_stream_decoder_get_state + (decoder)); OggFLAC__seekable_stream_decoder_delete(decoder); return NULL; } /* public functions: */ -static MpdTag * oggflac_TagDup(char * file) +static MpdTag *oggflac_TagDup(char *file) { InputStream inStream; - OggFLAC__SeekableStreamDecoder * decoder; + OggFLAC__SeekableStreamDecoder *decoder; FlacData data; - + if (openInputStream(&inStream, file) < 0) return NULL; if (ogg_stream_type_detect(&inStream) != FLAC) { @@ -317,10 +331,10 @@ static MpdTag * oggflac_TagDup(char * file) /* errors here won't matter, * data.tag will be set or unset, that's all we care about */ - decoder = full_decoder_init_and_read_metadata(&data,1); - + decoder = full_decoder_init_and_read_metadata(&data, 1); + oggflac_cleanup(&inStream, &data, decoder); - + return data.tag; } @@ -330,51 +344,49 @@ static unsigned int oggflac_try_decode(InputStream * inStream) } static int oggflac_decode(OutputBuffer * cb, DecoderControl * dc, - InputStream * inStream) + InputStream * inStream) { - OggFLAC__SeekableStreamDecoder * decoder = NULL; + OggFLAC__SeekableStreamDecoder *decoder = NULL; FlacData data; - int ret = 0; + int ret = 0; init_FlacData(&data, cb, dc, inStream); - if(!(decoder = full_decoder_init_and_read_metadata(&data,0))){ - ret = -1; - goto fail; - } + if (!(decoder = full_decoder_init_and_read_metadata(&data, 0))) { + ret = -1; + goto fail; + } dc->state = DECODE_STATE_DECODE; - while(1) { + while (1) { OggFLAC__seekable_stream_decoder_process_single(decoder); - if(OggFLAC__seekable_stream_decoder_get_state(decoder)!= - OggFLAC__SEEKABLE_STREAM_DECODER_OK) - { + if (OggFLAC__seekable_stream_decoder_get_state(decoder) != + OggFLAC__SEEKABLE_STREAM_DECODER_OK) { break; } - if(dc->seek) { - FLAC__uint64 sampleToSeek = dc->seekWhere* - dc->audioFormat.sampleRate+0.5; - if(OggFLAC__seekable_stream_decoder_seek_absolute( - decoder, sampleToSeek)) - { - clearOutputBuffer(cb); - data.time = ((float)sampleToSeek)/ - dc->audioFormat.sampleRate; + if (dc->seek) { + FLAC__uint64 sampleToSeek = dc->seekWhere * + dc->audioFormat.sampleRate + 0.5; + if (OggFLAC__seekable_stream_decoder_seek_absolute + (decoder, sampleToSeek)) { + clearOutputBuffer(cb); + data.time = ((float)sampleToSeek) / + dc->audioFormat.sampleRate; data.position = 0; - } - else dc->seekError = 1; + } else + dc->seekError = 1; dc->seek = 0; } } - - if(!dc->stop) { - oggflacPrintErroredState( - OggFLAC__seekable_stream_decoder_get_state(decoder)); + + if (!dc->stop) { + oggflacPrintErroredState + (OggFLAC__seekable_stream_decoder_get_state(decoder)); OggFLAC__seekable_stream_decoder_finish(decoder); } /* send last little bit */ - if(data.chunk_length>0 && !dc->stop) { + if (data.chunk_length > 0 && !dc->stop) { flacSendChunk(&data); flushOutputBuffer(data.cb); } @@ -382,17 +394,16 @@ static int oggflac_decode(OutputBuffer * cb, DecoderControl * dc, dc->state = DECODE_STATE_STOP; dc->stop = 0; -fail: + fail: oggflac_cleanup(inStream, &data, decoder); return ret; } -static char * oggflac_Suffixes[] = {"ogg", NULL}; -static char * oggflac_mime_types[] = {"application/ogg", NULL}; +static char *oggflac_Suffixes[] = { "ogg", NULL }; +static char *oggflac_mime_types[] = { "application/ogg", NULL }; -InputPlugin oggflacPlugin = -{ +InputPlugin oggflacPlugin = { "oggflac", NULL, NULL, @@ -405,10 +416,9 @@ InputPlugin oggflacPlugin = oggflac_mime_types }; -#else /* !HAVE_FLAC */ +#else /* !HAVE_FLAC */ -InputPlugin oggflacPlugin = -{ +InputPlugin oggflacPlugin = { NULL, NULL, NULL, @@ -421,5 +431,4 @@ InputPlugin oggflacPlugin = NULL, }; -#endif /* HAVE_OGGFLAC */ - +#endif /* HAVE_OGGFLAC */ |