From 3b2a6b7496300f6a6706b49a55dd75d1c8d06cac Mon Sep 17 00:00:00 2001 From: Laszlo Papp Date: Wed, 7 Dec 2011 18:46:00 +0200 Subject: Implement the seek callback and add the proper retval and args for read --- src/decoders/qalflacaudiodecoder.cpp | 55 ++++++++++++------------------------ 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/src/decoders/qalflacaudiodecoder.cpp b/src/decoders/qalflacaudiodecoder.cpp index 38e441c..3babe56 100644 --- a/src/decoders/qalflacaudiodecoder.cpp +++ b/src/decoders/qalflacaudiodecoder.cpp @@ -53,56 +53,37 @@ class QALFlacAudioDecoder::Private FLAC__StreamDecoder *flacStreamDecoder; }; -FLAC__StreamDecoderLengthStatus -QALFlacAudioDecoder::Private::lengthCallback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) +FLAC__StreamDecoderReadStatus +QALFlacAudioDecoder::Private::readCallback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { - reinterpret_cast(user_data)->file.size(); + return reinterpret_cast(client_data)->file.read(reinterpret_cast(ptr), count); } -sf_count_t -QALFlacAudioDecoder::Private::seekCallback(sf_count_t offset, int whence, void *user_data) +FLAC__StreamDecoderSeekStatus +QALFlacAudioDecoder::Private::seekCallback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { - QFile &tmpFile = reinterpret_cast(user_data)->file; - switch (whence) { - case SEEK_SET: - if (tmpFile.seek(offset) == true) - return offset; - - break; - - case SEEK_CUR: - offset += tmpFile.pos(); - if (tmpFile.seek(offset) == true) - return offset; - - break; - - case SEEK_END: - offset += tmpFile.size(); - if (tmpFile.seek(offset) == true) - return offset; - - break; - - default: - qWarning() << Q_FUNC_INFO << "Failed to seek the file:" << tmpFile.fileName() << "Invalid whence value:" << whence; - break; + if (reinterpret_cast(client_data)->file.seek(absolute_byte_offset) == false) { + qWarning() << Q_FUNC_INFO << "Failed to seek in the file"; + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; } - qWarning() << Q_FUNC_INFO << "Failed to seek the file:" << tmpFile.fileName(); - return -1; + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } sf_count_t -QALFlacAudioDecoder::Private::readCallback(void *ptr, sf_count_t count, void *user_data) +QALFlacAudioDecoder::Private::tellCallback(void *user_data) { - return reinterpret_cast(user_data)->file.read(reinterpret_cast(ptr), count); + return reinterpret_cast(user_data)->file.pos(); } -sf_count_t -QALFlacAudioDecoder::Private::tellCallback(void *user_data) +FLAC__StreamDecoderLengthStatus +QALFlacAudioDecoder::Private::lengthCallback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) { - return reinterpret_cast(user_data)->file.pos(); + Q_UNUSED(decoder) + + *stream_length = reinterpret_cast(client_data)->file.size(); + + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } QALFlacAudioDecoder::QALFlacAudioDecoder() -- cgit v1.2.3