annotate data/fileio/OggVorbisFileReader.h @ 661:a4faa1840384

* If a FileSource URL won't convert at all in strict mode, try again in tolerant mode (necessary for e.g. filenames with square brackets in them)
author Chris Cannam
date Tue, 19 Oct 2010 21:47:55 +0100
parents 7feec7756b41
children f3cda3280398 59e7fe1b1003
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 _OGG_VORBIS_FILE_READER_H_
Chris@148 17 #define _OGG_VORBIS_FILE_READER_H_
Chris@148 18
Chris@148 19 #ifdef HAVE_OGGZ
Chris@148 20 #ifdef HAVE_FISHSOUND
Chris@148 21
Chris@148 22 #include "CodedAudioFileReader.h"
Chris@148 23
Chris@263 24 #include "base/Thread.h"
Chris@148 25 #include <oggz/oggz.h>
Chris@148 26 #include <fishsound/fishsound.h>
Chris@148 27
Chris@157 28 #include <set>
Chris@157 29
Chris@392 30 class ProgressReporter;
Chris@148 31
Chris@148 32 class OggVorbisFileReader : public CodedAudioFileReader
Chris@148 33 {
Chris@392 34 Q_OBJECT
Chris@392 35
Chris@148 36 public:
Chris@263 37 enum DecodeMode {
Chris@392 38 DecodeAtOnce, // decode the file on construction, with progress
Chris@263 39 DecodeThreaded // decode in a background thread after construction
Chris@263 40 };
Chris@263 41
Chris@317 42 OggVorbisFileReader(FileSource source,
Chris@297 43 DecodeMode decodeMode,
Chris@297 44 CacheMode cacheMode,
Chris@392 45 size_t targetRate = 0,
Chris@392 46 ProgressReporter *reporter = 0);
Chris@148 47 virtual ~OggVorbisFileReader();
Chris@148 48
Chris@290 49 virtual QString getError() const { return m_error; }
Chris@290 50
Chris@345 51 virtual QString getLocation() const { return m_source.getLocation(); }
Chris@290 52 virtual QString getTitle() const { return m_title; }
Chris@333 53 virtual QString getMaker() const { return m_maker; }
Chris@633 54 virtual TagMap getTags() const { return m_tags; }
Chris@271 55
Chris@290 56 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@316 57 static bool supportsExtension(QString ext);
Chris@316 58 static bool supportsContentType(QString type);
Chris@317 59 static bool supports(FileSource &source);
Chris@157 60
Chris@265 61 virtual int getDecodeCompletion() const { return m_completion; }
Chris@265 62
Chris@263 63 virtual bool isUpdating() const {
Chris@263 64 return m_decodeThread && m_decodeThread->isRunning();
Chris@263 65 }
Chris@263 66
Chris@392 67 public slots:
Chris@392 68 void cancelled();
Chris@392 69
Chris@148 70 protected:
Chris@317 71 FileSource m_source;
Chris@290 72 QString m_path;
Chris@290 73 QString m_error;
Chris@290 74 QString m_title;
Chris@333 75 QString m_maker;
Chris@633 76 TagMap m_tags;
Chris@148 77
Chris@263 78 OGGZ *m_oggz;
Chris@148 79 FishSound *m_fishSound;
Chris@392 80 ProgressReporter *m_reporter;
Chris@148 81 size_t m_fileSize;
Chris@148 82 size_t m_bytesRead;
Chris@271 83 bool m_commentsRead;
Chris@148 84 bool m_cancelled;
Chris@265 85 int m_completion;
Chris@148 86
Chris@620 87 static int readPacket(OGGZ *, ogg_packet *, long, void *);
Chris@148 88 static int acceptFrames(FishSound *, float **, long, void *);
Chris@263 89
Chris@263 90 class DecodeThread : public Thread
Chris@263 91 {
Chris@263 92 public:
Chris@263 93 DecodeThread(OggVorbisFileReader *reader) : m_reader(reader) { }
Chris@263 94 virtual void run();
Chris@263 95
Chris@263 96 protected:
Chris@263 97 OggVorbisFileReader *m_reader;
Chris@263 98 };
Chris@263 99
Chris@263 100 DecodeThread *m_decodeThread;
Chris@148 101 };
Chris@148 102
Chris@148 103 #endif
Chris@148 104 #endif
Chris@148 105
Chris@148 106 #endif