| 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@317 | 38     MP3FileReader(FileSource source, | 
| Chris@297 | 39                   DecodeMode decodeMode, | 
| Chris@297 | 40                   CacheMode cacheMode, | 
| Chris@297 | 41                   size_t targetRate = 0); | 
| Chris@148 | 42     virtual ~MP3FileReader(); | 
| Chris@148 | 43 | 
| Chris@290 | 44     virtual QString getError() const { return m_error; } | 
| Chris@290 | 45 | 
| Chris@345 | 46     virtual QString getLocation() const { return m_source.getLocation(); } | 
| Chris@290 | 47     virtual QString getTitle() const { return m_title; } | 
| Chris@334 | 48     virtual QString getMaker() const { return m_maker; } | 
| Chris@271 | 49 | 
| Chris@290 | 50     static void getSupportedExtensions(std::set<QString> &extensions); | 
| Chris@316 | 51     static bool supportsExtension(QString ext); | 
| Chris@316 | 52     static bool supportsContentType(QString type); | 
| Chris@317 | 53     static bool supports(FileSource &source); | 
| Chris@316 | 54 | 
| Chris@265 | 55     virtual int getDecodeCompletion() const { return m_completion; } | 
| Chris@265 | 56 | 
| Chris@263 | 57     virtual bool isUpdating() const { | 
| Chris@263 | 58         return m_decodeThread && m_decodeThread->isRunning(); | 
| Chris@263 | 59     } | 
| Chris@263 | 60 | 
| Chris@148 | 61 protected: | 
| Chris@317 | 62     FileSource m_source; | 
| Chris@290 | 63     QString m_path; | 
| Chris@290 | 64     QString m_error; | 
| Chris@290 | 65     QString m_title; | 
| Chris@333 | 66     QString m_maker; | 
| Chris@148 | 67     size_t m_fileSize; | 
| Chris@148 | 68     double m_bitrateNum; | 
| Chris@148 | 69     size_t m_bitrateDenom; | 
| Chris@265 | 70     int m_completion; | 
| Chris@263 | 71     bool m_done; | 
| Chris@263 | 72 | 
| Chris@263 | 73     unsigned char *m_filebuffer; | 
| Chris@297 | 74     float **m_samplebuffer; | 
| Chris@297 | 75     size_t m_samplebuffersize; | 
| Chris@148 | 76 | 
| Chris@148 | 77     QProgressDialog *m_progress; | 
| Chris@148 | 78     bool m_cancelled; | 
| Chris@148 | 79 | 
| Chris@148 | 80     struct DecoderData | 
| Chris@148 | 81     { | 
| Chris@148 | 82 	unsigned char const *start; | 
| Chris@148 | 83 	unsigned long length; | 
| Chris@148 | 84 	MP3FileReader *reader; | 
| Chris@148 | 85     }; | 
| Chris@148 | 86 | 
| Chris@148 | 87     bool decode(void *mm, size_t sz); | 
| Chris@148 | 88     enum mad_flow accept(struct mad_header const *, struct mad_pcm *); | 
| Chris@148 | 89 | 
| Chris@148 | 90     static enum mad_flow input(void *, struct mad_stream *); | 
| Chris@148 | 91     static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *); | 
| Chris@148 | 92     static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *); | 
| Chris@263 | 93 | 
| Chris@263 | 94     class DecodeThread : public Thread | 
| Chris@263 | 95     { | 
| Chris@263 | 96     public: | 
| Chris@263 | 97         DecodeThread(MP3FileReader *reader) : m_reader(reader) { } | 
| Chris@263 | 98         virtual void run(); | 
| Chris@263 | 99 | 
| Chris@263 | 100     protected: | 
| Chris@263 | 101         MP3FileReader *m_reader; | 
| Chris@263 | 102     }; | 
| Chris@263 | 103 | 
| Chris@263 | 104     DecodeThread *m_decodeThread; | 
| Chris@271 | 105 | 
| Chris@271 | 106     void loadTags(); | 
| Chris@333 | 107     QString loadTag(void *vtag, const char *name); | 
| Chris@148 | 108 }; | 
| Chris@148 | 109 | 
| Chris@148 | 110 #endif | 
| Chris@148 | 111 | 
| Chris@148 | 112 #endif |