summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)
{