annotate data/fileio/MP3FileReader.h @ 316:3a6725f285d6

* Make RemoteFile far more pervasive, and use it for local files as well so that we can handle both transparently. Make it shallow copy with reference counting, so it can be used by value without having to worry about the cache file lifetime. Use RemoteFile for MainWindow file-open functions, etc
author Chris Cannam
date Thu, 18 Oct 2007 15:31:20 +0000
parents c022976d18e8
children c324d410b096
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@316 38 MP3FileReader(RemoteFile 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@290 46 virtual QString getTitle() const { return m_title; }
Chris@271 47
Chris@290 48 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@316 49 static bool supportsExtension(QString ext);
Chris@316 50 static bool supportsContentType(QString type);
Chris@316 51 static bool supports(RemoteFile &source);
Chris@316 52
Chris@265 53 virtual int getDecodeCompletion() const { return m_completion; }
Chris@265 54
Chris@263 55 virtual bool isUpdating() const {
Chris@263 56 return m_decodeThread && m_decodeThread->isRunning();
Chris@263 57 }
Chris@263 58
Chris@148 59 protected:
Chris@316 60 RemoteFile m_source;
Chris@290 61 QString m_path;
Chris@290 62 QString m_error;
Chris@290 63 QString m_title;
Chris@148 64 size_t m_fileSize;
Chris@148 65 double m_bitrateNum;
Chris@148 66 size_t m_bitrateDenom;
Chris@265 67 int m_completion;
Chris@263 68 bool m_done;
Chris@263 69
Chris@263 70 unsigned char *m_filebuffer;
Chris@297 71 float **m_samplebuffer;
Chris@297 72 size_t m_samplebuffersize;
Chris@148 73
Chris@148 74 QProgressDialog *m_progress;
Chris@148 75 bool m_cancelled;
Chris@148 76
Chris@148 77 struct DecoderData
Chris@148 78 {
Chris@148 79 unsigned char const *start;
Chris@148 80 unsigned long length;
Chris@148 81 MP3FileReader *reader;
Chris@148 82 };
Chris@148 83
Chris@148 84 bool decode(void *mm, size_t sz);
Chris@148 85 enum mad_flow accept(struct mad_header const *, struct mad_pcm *);
Chris@148 86
Chris@148 87 static enum mad_flow input(void *, struct mad_stream *);
Chris@148 88 static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *);
Chris@148 89 static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *);
Chris@263 90
Chris@263 91 class DecodeThread : public Thread
Chris@263 92 {
Chris@263 93 public:
Chris@263 94 DecodeThread(MP3FileReader *reader) : m_reader(reader) { }
Chris@263 95 virtual void run();
Chris@263 96
Chris@263 97 protected:
Chris@263 98 MP3FileReader *m_reader;
Chris@263 99 };
Chris@263 100
Chris@263 101 DecodeThread *m_decodeThread;
Chris@271 102
Chris@271 103 void loadTags();
Chris@148 104 };
Chris@148 105
Chris@148 106 #endif
Chris@148 107
Chris@148 108 #endif