inputPlugins/flac_plugin: cleanup static declarations
move flac_decode to the bottom, so we don't have to declare all of our static functions. git-svn-id: https://svn.musicpd.org/mpd/trunk@5109 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
fc4868a040
commit
5048388251
@ -38,155 +38,6 @@
|
|||||||
|
|
||||||
/* this code is based on flac123, from flac-tools */
|
/* this code is based on flac123, from flac-tools */
|
||||||
|
|
||||||
static void flacError(const FLAC__SeekableStreamDecoder *,
|
|
||||||
FLAC__StreamDecoderErrorStatus, void *);
|
|
||||||
static void flacPrintErroredState(FLAC__SeekableStreamDecoderState state);
|
|
||||||
static void flacMetadata(const FLAC__SeekableStreamDecoder *,
|
|
||||||
const FLAC__StreamMetadata *, void *);
|
|
||||||
static FLAC__StreamDecoderWriteStatus flacWrite(const
|
|
||||||
FLAC__SeekableStreamDecoder *,
|
|
||||||
const FLAC__Frame *,
|
|
||||||
const FLAC__int32 * const buf[],
|
|
||||||
void *);
|
|
||||||
static FLAC__SeekableStreamDecoderReadStatus flacRead(const
|
|
||||||
FLAC__SeekableStreamDecoder
|
|
||||||
*, FLAC__byte buf[],
|
|
||||||
unsigned *, void *);
|
|
||||||
static FLAC__SeekableStreamDecoderSeekStatus flacSeek(const
|
|
||||||
FLAC__SeekableStreamDecoder
|
|
||||||
*, FLAC__uint64, void *);
|
|
||||||
static FLAC__SeekableStreamDecoderTellStatus flacTell(const
|
|
||||||
FLAC__SeekableStreamDecoder
|
|
||||||
*, FLAC__uint64 *,
|
|
||||||
void *);
|
|
||||||
static FLAC__SeekableStreamDecoderLengthStatus flacLength(const
|
|
||||||
FLAC__SeekableStreamDecoder
|
|
||||||
*, FLAC__uint64 *,
|
|
||||||
void *);
|
|
||||||
static FLAC__bool flacEOF(const FLAC__SeekableStreamDecoder *, void *);
|
|
||||||
|
|
||||||
static int flac_decode(OutputBuffer * cb, DecoderControl * dc,
|
|
||||||
InputStream * inStream)
|
|
||||||
{
|
|
||||||
FLAC__SeekableStreamDecoder *flacDec = NULL;
|
|
||||||
FlacData data;
|
|
||||||
int status = 1;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
init_FlacData(&data, cb, dc, inStream);
|
|
||||||
|
|
||||||
if (!(flacDec = FLAC__seekable_stream_decoder_new())) {
|
|
||||||
ret = -1;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
/*status&=FLAC__file_decoder_set_md5_checking(flacDec,1); */
|
|
||||||
status &= FLAC__seekable_stream_decoder_set_read_callback(flacDec,
|
|
||||||
flacRead);
|
|
||||||
status &= FLAC__seekable_stream_decoder_set_seek_callback(flacDec,
|
|
||||||
flacSeek);
|
|
||||||
status &= FLAC__seekable_stream_decoder_set_tell_callback(flacDec,
|
|
||||||
flacTell);
|
|
||||||
status &= FLAC__seekable_stream_decoder_set_length_callback(flacDec,
|
|
||||||
flacLength);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_eof_callback(flacDec, flacEOF);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_write_callback(flacDec,
|
|
||||||
flacWrite);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_metadata_callback(flacDec,
|
|
||||||
flacMetadata);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_metadata_respond(flacDec,
|
|
||||||
FLAC__METADATA_TYPE_VORBIS_COMMENT);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_error_callback(flacDec,
|
|
||||||
flacError);
|
|
||||||
status &=
|
|
||||||
FLAC__seekable_stream_decoder_set_client_data(flacDec,
|
|
||||||
(void *)&data);
|
|
||||||
if (!status) {
|
|
||||||
ERROR("flac problem before init()\n");
|
|
||||||
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
|
||||||
(flacDec));
|
|
||||||
ret = -1;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FLAC__seekable_stream_decoder_init(flacDec) !=
|
|
||||||
FLAC__SEEKABLE_STREAM_DECODER_OK) {
|
|
||||||
ERROR("flac problem doing init()\n");
|
|
||||||
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
|
||||||
(flacDec));
|
|
||||||
ret = -1;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!FLAC__seekable_stream_decoder_process_until_end_of_metadata
|
|
||||||
(flacDec)) {
|
|
||||||
ERROR("flac problem reading metadata\n");
|
|
||||||
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
|
||||||
(flacDec));
|
|
||||||
ret = -1;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
dc->state = DECODE_STATE_DECODE;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
FLAC__seekable_stream_decoder_process_single(flacDec);
|
|
||||||
if (FLAC__seekable_stream_decoder_get_state(flacDec) !=
|
|
||||||
FLAC__SEEKABLE_STREAM_DECODER_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (dc->seek) {
|
|
||||||
FLAC__uint64 sampleToSeek = dc->seekWhere *
|
|
||||||
dc->audioFormat.sampleRate + 0.5;
|
|
||||||
if (FLAC__seekable_stream_decoder_seek_absolute(flacDec,
|
|
||||||
sampleToSeek))
|
|
||||||
{
|
|
||||||
clearOutputBuffer(cb);
|
|
||||||
data.time = ((float)sampleToSeek) /
|
|
||||||
dc->audioFormat.sampleRate;
|
|
||||||
data.position = 0;
|
|
||||||
} else
|
|
||||||
dc->seekError = 1;
|
|
||||||
dc->seek = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* I don't think we need this bit here! -shank */
|
|
||||||
/*FLAC__file_decoder_process_until_end_of_file(flacDec); */
|
|
||||||
if (!dc->stop) {
|
|
||||||
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
|
||||||
(flacDec));
|
|
||||||
FLAC__seekable_stream_decoder_finish(flacDec);
|
|
||||||
}
|
|
||||||
/* send last little bit */
|
|
||||||
if (data.chunk_length > 0 && !dc->stop) {
|
|
||||||
flacSendChunk(&data);
|
|
||||||
flushOutputBuffer(data.cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if(dc->seek) {
|
|
||||||
dc->seekError = 1;
|
|
||||||
dc->seek = 0;
|
|
||||||
} */
|
|
||||||
|
|
||||||
dc->state = DECODE_STATE_STOP;
|
|
||||||
dc->stop = 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (data.replayGainInfo)
|
|
||||||
freeReplayGainInfo(data.replayGainInfo);
|
|
||||||
|
|
||||||
if (flacDec)
|
|
||||||
FLAC__seekable_stream_decoder_delete(flacDec);
|
|
||||||
|
|
||||||
closeInputStream(inStream);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FLAC__SeekableStreamDecoderReadStatus flacRead(const
|
static FLAC__SeekableStreamDecoderReadStatus flacRead(const
|
||||||
FLAC__SeekableStreamDecoder
|
FLAC__SeekableStreamDecoder
|
||||||
* flacDec,
|
* flacDec,
|
||||||
@ -438,6 +289,128 @@ static MpdTag *flacTagDup(char *file)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int flac_decode(OutputBuffer * cb, DecoderControl * dc,
|
||||||
|
InputStream * inStream)
|
||||||
|
{
|
||||||
|
FLAC__SeekableStreamDecoder *flacDec = NULL;
|
||||||
|
FlacData data;
|
||||||
|
int status = 1;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
init_FlacData(&data, cb, dc, inStream);
|
||||||
|
|
||||||
|
if (!(flacDec = FLAC__seekable_stream_decoder_new())) {
|
||||||
|
ret = -1;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
/*status&=FLAC__file_decoder_set_md5_checking(flacDec,1); */
|
||||||
|
status &= FLAC__seekable_stream_decoder_set_read_callback(flacDec,
|
||||||
|
flacRead);
|
||||||
|
status &= FLAC__seekable_stream_decoder_set_seek_callback(flacDec,
|
||||||
|
flacSeek);
|
||||||
|
status &= FLAC__seekable_stream_decoder_set_tell_callback(flacDec,
|
||||||
|
flacTell);
|
||||||
|
status &= FLAC__seekable_stream_decoder_set_length_callback(flacDec,
|
||||||
|
flacLength);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_eof_callback(flacDec, flacEOF);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_write_callback(flacDec,
|
||||||
|
flacWrite);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_metadata_callback(flacDec,
|
||||||
|
flacMetadata);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_metadata_respond(flacDec,
|
||||||
|
FLAC__METADATA_TYPE_VORBIS_COMMENT);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_error_callback(flacDec,
|
||||||
|
flacError);
|
||||||
|
status &=
|
||||||
|
FLAC__seekable_stream_decoder_set_client_data(flacDec,
|
||||||
|
(void *)&data);
|
||||||
|
if (!status) {
|
||||||
|
ERROR("flac problem before init()\n");
|
||||||
|
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
||||||
|
(flacDec));
|
||||||
|
ret = -1;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FLAC__seekable_stream_decoder_init(flacDec) !=
|
||||||
|
FLAC__SEEKABLE_STREAM_DECODER_OK) {
|
||||||
|
ERROR("flac problem doing init()\n");
|
||||||
|
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
||||||
|
(flacDec));
|
||||||
|
ret = -1;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FLAC__seekable_stream_decoder_process_until_end_of_metadata
|
||||||
|
(flacDec)) {
|
||||||
|
ERROR("flac problem reading metadata\n");
|
||||||
|
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
||||||
|
(flacDec));
|
||||||
|
ret = -1;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc->state = DECODE_STATE_DECODE;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
FLAC__seekable_stream_decoder_process_single(flacDec);
|
||||||
|
if (FLAC__seekable_stream_decoder_get_state(flacDec) !=
|
||||||
|
FLAC__SEEKABLE_STREAM_DECODER_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (dc->seek) {
|
||||||
|
FLAC__uint64 sampleToSeek = dc->seekWhere *
|
||||||
|
dc->audioFormat.sampleRate + 0.5;
|
||||||
|
if (FLAC__seekable_stream_decoder_seek_absolute(flacDec,
|
||||||
|
sampleToSeek))
|
||||||
|
{
|
||||||
|
clearOutputBuffer(cb);
|
||||||
|
data.time = ((float)sampleToSeek) /
|
||||||
|
dc->audioFormat.sampleRate;
|
||||||
|
data.position = 0;
|
||||||
|
} else
|
||||||
|
dc->seekError = 1;
|
||||||
|
dc->seek = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* I don't think we need this bit here! -shank */
|
||||||
|
/*FLAC__file_decoder_process_until_end_of_file(flacDec); */
|
||||||
|
if (!dc->stop) {
|
||||||
|
flacPrintErroredState(FLAC__seekable_stream_decoder_get_state
|
||||||
|
(flacDec));
|
||||||
|
FLAC__seekable_stream_decoder_finish(flacDec);
|
||||||
|
}
|
||||||
|
/* send last little bit */
|
||||||
|
if (data.chunk_length > 0 && !dc->stop) {
|
||||||
|
flacSendChunk(&data);
|
||||||
|
flushOutputBuffer(data.cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if(dc->seek) {
|
||||||
|
dc->seekError = 1;
|
||||||
|
dc->seek = 0;
|
||||||
|
} */
|
||||||
|
|
||||||
|
dc->state = DECODE_STATE_STOP;
|
||||||
|
dc->stop = 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (data.replayGainInfo)
|
||||||
|
freeReplayGainInfo(data.replayGainInfo);
|
||||||
|
|
||||||
|
if (flacDec)
|
||||||
|
FLAC__seekable_stream_decoder_delete(flacDec);
|
||||||
|
|
||||||
|
closeInputStream(inStream);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static char *flacSuffixes[] = { "flac", NULL };
|
static char *flacSuffixes[] = { "flac", NULL };
|
||||||
static char *flac_mime_types[] = { "application/x-flac", NULL };
|
static char *flac_mime_types[] = { "application/x-flac", NULL };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user