annotate data/fileio/MP3FileReader.h @ 263:71dfc6ab3b54

* Threaded mp3/ogg file reading. Not activated yet, as it doesn't work in context (SV needs to know the duration of its main model at the outset)
author Chris Cannam
date Thu, 24 May 2007 16:20:22 +0000
parents c03ec31005e1
children e08f486e8d8c
rev   line source
Chris@148 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@148 2
Chris@148 3 /*
Chris@148 4 Sonic Visualiser
Chris@148 5 An audio file viewer and annotation editor.
Chris@148 6 Centre for Digital Music, Queen Mary, University of London.
Chris@148 7 This file copyright 2006 Chris Cannam.
Chris@148 8
Chris@148 9 This program is free software; you can redistribute it and/or
Chris@148 10 modify it under the terms of the GNU General Public License as
Chris@148 11 published by the Free Software Foundation; either version 2 of the
Chris@148 12 License, or (at your option) any later version. See the file
Chris@148 13 COPYING included with this distribution for more information.
Chris@148 14 */
Chris@148 15
Chris@148 16 #ifndef _MP3_FILE_READER_H_
Chris@148 17 #define _MP3_FILE_READER_H_
Chris@148 18
Chris@148 19 #ifdef HAVE_MAD
Chris@148 20
Chris@148 21 #include "CodedAudioFileReader.h"
Chris@148 22
Chris@263 23 #include "base/Thread.h"
Chris@148 24 #include <mad.h>
Chris@148 25
Chris@157 26 #include <set>
Chris@157 27
Chris@148 28 class QProgressDialog;
Chris@148 29
Chris@148 30 class MP3FileReader : public CodedAudioFileReader
Chris@148 31 {
Chris@148 32 public:
Chris@263 33 enum DecodeMode {
Chris@263 34 DecodeAtOnce, // decode the file on construction, with progress dialog
Chris@263 35 DecodeThreaded // decode in a background thread after construction
Chris@263 36 };
Chris@263 37
Chris@263 38 MP3FileReader(QString path, DecodeMode decodeMode, CacheMode cacheMode);
Chris@148 39 virtual ~MP3FileReader();
Chris@148 40
Chris@148 41 virtual QString getError() const { return m_error; }
Chris@157 42
Chris@157 43 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@148 44
Chris@263 45 virtual bool isUpdating() const {
Chris@263 46 return m_decodeThread && m_decodeThread->isRunning();
Chris@263 47 }
Chris@263 48
Chris@148 49 protected:
Chris@148 50 QString m_path;
Chris@148 51 QString m_error;
Chris@148 52 size_t m_fileSize;
Chris@148 53 double m_bitrateNum;
Chris@148 54 size_t m_bitrateDenom;
Chris@263 55 bool m_done;
Chris@263 56
Chris@263 57 unsigned char *m_filebuffer;
Chris@148 58
Chris@148 59 QProgressDialog *m_progress;
Chris@148 60 bool m_cancelled;
Chris@148 61
Chris@148 62 struct DecoderData
Chris@148 63 {
Chris@148 64 unsigned char const *start;
Chris@148 65 unsigned long length;
Chris@148 66 MP3FileReader *reader;
Chris@148 67 };
Chris@148 68
Chris@148 69 bool decode(void *mm, size_t sz);
Chris@148 70 enum mad_flow accept(struct mad_header const *, struct mad_pcm *);
Chris@148 71
Chris@148 72 static enum mad_flow input(void *, struct mad_stream *);
Chris@148 73 static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *);
Chris@148 74 static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *);
Chris@263 75
Chris@263 76 class DecodeThread : public Thread
Chris@263 77 {
Chris@263 78 public:
Chris@263 79 DecodeThread(MP3FileReader *reader) : m_reader(reader) { }
Chris@263 80 virtual void run();
Chris@263 81
Chris@263 82 protected:
Chris@263 83 MP3FileReader *m_reader;
Chris@263 84 };
Chris@263 85
Chris@263 86 DecodeThread *m_decodeThread;
Chris@148 87 };
Chris@148 88
Chris@148 89 #endif
Chris@148 90
Chris@148 91 #endif