annotate data/fileio/MP3FileReader.h @ 360:ac300d385ab2

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents 700cd3350391
children 183ee2a55fc7
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@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