diff options
author | Laszlo Papp <lpapp@kde.org> | 2011-11-30 23:23:04 +0200 |
---|---|---|
committer | Laszlo Papp <ext-laszlo.papp@nokia.com> | 2011-11-30 23:23:04 +0200 |
commit | 96bb46a28c5b69e620ed1e7e08ba35f0bfa092cd (patch) | |
tree | ceb55fd9b7aff581dc41e68175f2940484e40fe0 | |
parent | 6e045244631b9adae5aae8fb8c7d3252c3c51a48 (diff) |
Implement the seek, tell and read callbacks inside the snd audio decoder
-rw-r--r-- | src/qalsndaudiodecoder.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/qalsndaudiodecoder.cpp b/src/qalsndaudiodecoder.cpp index 735388b..325e847 100644 --- a/src/qalsndaudiodecoder.cpp +++ b/src/qalsndaudiodecoder.cpp @@ -37,10 +37,62 @@ class QALSndAudioDecoder::Private { } + static sf_count_t seekCallback(sf_count_t offset, int whence, void *user_data); + static sf_count_t readCallback(void *ptr, sf_count_t count, void *user_data); + static sf_count_t tellCallback(void *user_data); + + static QFile file; + QByteArray encodedData; SNDFILE *sndFile; }; +sf_count_t +QALSndAudioDecoder::Private::seekCallback(sf_count_t offset, int whence, void *user_data) +{ + sf_count_t tmpOffset; + switch (whence) { + case SEEK_SET: + if (reinterpret_cast<QALSndAudioDecoder::Private*>(user_data)->file.seek(offset) == true) + return offset; + + break; + + case SEEK_CUR: + tmpOffset = file.pos() + offset; + if (reinterpret_cast<QALSndAudioDecoder::Private*>(user_data)->file.seek(tmpOffset) == true) + return tmpOffset; + + break; + + case SEEK_END: + tmpOffset = file.size() + offset; + if (reinterpret_cast<QALSndAudioDecoder::Private*>(user_data)->file.seek(tmpOffset) == true) + return tmpOffset; + + break; + + default: + qWarning() << Q_FUNC_INFO << "Failed to see the file:" << file.fileName() << "Invalid whence value:" << whence; + break; + } + + qWarning() << Q_FUNC_INFO << "Failed to seek the file:" << file.fileName(); + return -1; +} + +sf_count_t +QALSndAudioDecoder::Private::readCallback(void *ptr, sf_count_t count, void *user_data) +{ + return reinterpret_cast<QALSndAudioDecoder::Private*>(user_data)->file.read(reinterpret_cast<char*>(ptr), count); +} + +sf_count_t +QALSndAudioDecoder::Private::tellCallback(void *user_data) +{ + return reinterpret_cast<QALSndAudioDecoder::Private*>(user_data)->file.pos(); +} + QALSndAudioDecoder::QALSndAudioDecoder() : d(new Private) { |