annotate data/fileio/MP3FileReader.h @ 1061:c1e43c8d2527 tonioni

Thread-local debug was causing crash on exit with Qt 5.4.x. But we introduced that because QDebug itself was crashing when used from multiple threads. Replace with simpler fstream version
author Chris Cannam
date Tue, 31 Mar 2015 10:36:52 +0100
parents a1cd5abcb38b
children abc309f507ae
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@392 28 class ProgressReporter;
Chris@148 29
Chris@148 30 class MP3FileReader : public CodedAudioFileReader
Chris@148 31 {
Chris@392 32 Q_OBJECT
Chris@392 33
Chris@148 34 public:
Chris@263 35 enum DecodeMode {
Chris@392 36 DecodeAtOnce, // decode the file on construction, with progress
Chris@263 37 DecodeThreaded // decode in a background thread after construction
Chris@263 38 };
Chris@263 39
Chris@317 40 MP3FileReader(FileSource source,
Chris@297 41 DecodeMode decodeMode,
Chris@297 42 CacheMode cacheMode,
Chris@1040 43 sv_samplerate_t targetRate = 0,
Chris@920 44 bool normalised = false,
Chris@392 45 ProgressReporter *reporter = 0);
Chris@148 46 virtual ~MP3FileReader();
Chris@148 47
Chris@290 48 virtual QString getError() const { return m_error; }
Chris@290 49
Chris@345 50 virtual QString getLocation() const { return m_source.getLocation(); }
Chris@290 51 virtual QString getTitle() const { return m_title; }
Chris@334 52 virtual QString getMaker() const { return m_maker; }
Chris@632 53 virtual TagMap getTags() const { return m_tags; }
Chris@271 54
Chris@290 55 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@316 56 static bool supportsExtension(QString ext);
Chris@316 57 static bool supportsContentType(QString type);
Chris@317 58 static bool supports(FileSource &source);
Chris@316 59
Chris@265 60 virtual int getDecodeCompletion() const { return m_completion; }
Chris@265 61
Chris@263 62 virtual bool isUpdating() const {
Chris@263 63 return m_decodeThread && m_decodeThread->isRunning();
Chris@263 64 }
Chris@263 65
Chris@392 66 public slots:
Chris@392 67 void cancelled();
Chris@392 68
Chris@148 69 protected:
Chris@317 70 FileSource m_source;
Chris@290 71 QString m_path;
Chris@290 72 QString m_error;
Chris@290 73 QString m_title;
Chris@333 74 QString m_maker;
Chris@632 75 TagMap m_tags;
Chris@1038 76 sv_frame_t m_fileSize;
Chris@148 77 double m_bitrateNum;
Chris@929 78 int m_bitrateDenom;
Chris@265 79 int m_completion;
Chris@263 80 bool m_done;
Chris@263 81
Chris@263 82 unsigned char *m_filebuffer;
Chris@297 83 float **m_samplebuffer;
Chris@929 84 int m_samplebuffersize;
Chris@148 85
Chris@392 86 ProgressReporter *m_reporter;
Chris@148 87 bool m_cancelled;
Chris@148 88
Chris@148 89 struct DecoderData
Chris@148 90 {
Chris@148 91 unsigned char const *start;
Chris@148 92 unsigned long length;
Chris@148 93 MP3FileReader *reader;
Chris@148 94 };
Chris@148 95
Chris@1038 96 bool decode(void *mm, sv_frame_t sz);
Chris@148 97 enum mad_flow accept(struct mad_header const *, struct mad_pcm *);
Chris@148 98
Chris@148 99 static enum mad_flow input(void *, struct mad_stream *);
Chris@148 100 static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *);
Chris@148 101 static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *);
Chris@263 102
Chris@263 103 class DecodeThread : public Thread
Chris@263 104 {
Chris@263 105 public:
Chris@263 106 DecodeThread(MP3FileReader *reader) : m_reader(reader) { }
Chris@263 107 virtual void run();
Chris@263 108
Chris@263 109 protected:
Chris@263 110 MP3FileReader *m_reader;
Chris@263 111 };
Chris@263 112
Chris@263 113 DecodeThread *m_decodeThread;
Chris@271 114
Chris@271 115 void loadTags();
Chris@333 116 QString loadTag(void *vtag, const char *name);
Chris@148 117 };
Chris@148 118
Chris@148 119 #endif
Chris@148 120
Chris@148 121 #endif