summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Papp <lpapp@kde.org>2011-11-30 23:23:04 +0200
committerLaszlo Papp <ext-laszlo.papp@nokia.com>2011-11-30 23:23:04 +0200
commit96bb46a28c5b69e620ed1e7e08ba35f0bfa092cd (patch)
treeceb55fd9b7aff581dc41e68175f2940484e40fe0
parent6e045244631b9adae5aae8fb8c7d3252c3c51a48 (diff)
Implement the seek, tell and read callbacks inside the snd audio decoder
-rw-r--r--src/qalsndaudiodecoder.cpp52
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)
{