annotate data/fileio/MP3FileReader.h @ 295:a2dc34ce146a

* Window should be centred on its nominal time. I'm not sure what the reasoning was behind the previous formulations of these two lines.
author Chris Cannam
date Thu, 06 Sep 2007 15:14:47 +0000
parents 92e8dbde73cd
children c022976d18e8
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@290 38 MP3FileReader(QString path, DecodeMode decodeMode, CacheMode cacheMode);
Chris@148 39 virtual ~MP3FileReader();
Chris@148 40
Chris@290 41 virtual QString getError() const { return m_error; }
Chris@290 42
Chris@290 43 virtual QString getTitle() const { return m_title; }
Chris@271 44
Chris@290 45 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@148 46
Chris@265 47 virtual int getDecodeCompletion() const { return m_completion; }
Chris@265 48
Chris@263 49 virtual bool isUpdating() const {
Chris@263 50 return m_decodeThread && m_decodeThread->isRunning();
Chris@263 51 }
Chris@263 52
Chris@148 53 protected:
Chris@290 54 QString m_path;
Chris@290 55 QString m_error;
Chris@290 56 QString m_title;
Chris@148 57 size_t m_fileSize;
Chris@148 58 double m_bitrateNum;
Chris@148 59 size_t m_bitrateDenom;
Chris@265 60 int m_completion;
Chris@263 61 bool m_done;
Chris@263 62
Chris@263 63 unsigned char *m_filebuffer;
Chris@148 64
Chris@148 65 QProgressDialog *m_progress;
Chris@148 66 bool m_cancelled;
Chris@148 67
Chris@148 68 struct DecoderData
Chris@148 69 {
Chris@148 70 unsigned char const *start;
Chris@148 71 unsigned long length;
Chris@148 72 MP3FileReader *reader;
Chris@148 73 };
Chris@148 74
Chris@148 75 bool decode(void *mm, size_t sz);
Chris@148 76 enum mad_flow accept(struct mad_header const *, struct mad_pcm *);
Chris@148 77
Chris@148 78 static enum mad_flow input(void *, struct mad_stream *);
Chris@148 79 static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *);
Chris@148 80 static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *);
Chris@263 81
Chris@263 82 class DecodeThread : public Thread
Chris@263 83 {
Chris@263 84 public:
Chris@263 85 DecodeThread(MP3FileReader *reader) : m_reader(reader) { }
Chris@263 86 virtual void run();
Chris@263 87
Chris@263 88 protected:
Chris@263 89 MP3FileReader *m_reader;
Chris@263 90 };
Chris@263 91
Chris@263 92 DecodeThread *m_decodeThread;
Chris@271 93
Chris@271 94 void loadTags();
Chris@148 95 };
Chris@148 96
Chris@148 97 #endif
Chris@148 98
Chris@148 99 #endif