annotate data/fileio/OggVorbisFileReader.h @ 392:183ee2a55fc7

* More work to abstract out interactive components used in the data library, so that it does not need to depend on QtGui.
author Chris Cannam
date Fri, 14 Mar 2008 17:14:21 +0000
parents 700cd3350391
children 268c5431936d
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@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@157 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@148 75
Chris@263 76 OGGZ *m_oggz;
Chris@148 77 FishSound *m_fishSound;
Chris@392 78 ProgressReporter *m_reporter;
Chris@148 79 size_t m_fileSize;
Chris@148 80 size_t m_bytesRead;
Chris@271 81 bool m_commentsRead;
Chris@148 82 bool m_cancelled;
Chris@265 83 int m_completion;
Chris@148 84
Chris@148 85 static int readPacket(OGGZ *, ogg_packet *, long, void *);
Chris@148 86 static int acceptFrames(FishSound *, float **, long, void *);
Chris@263 87
Chris@263 88 class DecodeThread : public Thread
Chris@263 89 {
Chris@263 90 public:
Chris@263 91 DecodeThread(OggVorbisFileReader *reader) : m_reader(reader) { }
Chris@263 92 virtual void run();
Chris@263 93
Chris@263 94 protected:
Chris@263 95 OggVorbisFileReader *m_reader;
Chris@263 96 };
Chris@263 97
Chris@263 98 DecodeThread *m_decodeThread;
Chris@148 99 };
Chris@148 100
Chris@148 101 #endif
Chris@148 102 #endif
Chris@148 103
Chris@148 104 #endif