annotate data/fileio/AudioFileReaderFactory.cpp @ 263:71dfc6ab3b54

* Threaded mp3/ogg file reading. Not activated yet, as it doesn't work in context (SV needs to know the duration of its main model at the outset)
author Chris Cannam
date Thu, 24 May 2007 16:20:22 +0000
parents 2b40f83e7627
children e08f486e8d8c
rev   line source
Chris@235 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@235 2
Chris@235 3 /*
Chris@235 4 Sonic Visualiser
Chris@235 5 An audio file viewer and annotation editor.
Chris@235 6 Centre for Digital Music, Queen Mary, University of London.
Chris@235 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@235 8
Chris@235 9 This program is free software; you can redistribute it and/or
Chris@235 10 modify it under the terms of the GNU General Public License as
Chris@235 11 published by the Free Software Foundation; either version 2 of the
Chris@235 12 License, or (at your option) any later version. See the file
Chris@235 13 COPYING included with this distribution for more information.
Chris@235 14 */
Chris@235 15
Chris@235 16 #include "AudioFileReaderFactory.h"
Chris@235 17
Chris@235 18 #include "WavFileReader.h"
Chris@235 19 #include "OggVorbisFileReader.h"
Chris@235 20 #include "MP3FileReader.h"
Chris@235 21
Chris@235 22 #include <QString>
Chris@241 23 #include <QFileInfo>
Chris@235 24 #include <iostream>
Chris@235 25
Chris@235 26 QString
Chris@235 27 AudioFileReaderFactory::getKnownExtensions()
Chris@235 28 {
Chris@235 29 std::set<QString> extensions;
Chris@235 30
Chris@235 31 WavFileReader::getSupportedExtensions(extensions);
Chris@235 32 #ifdef HAVE_MAD
Chris@235 33 MP3FileReader::getSupportedExtensions(extensions);
Chris@235 34 #endif
Chris@235 35 #ifdef HAVE_OGGZ
Chris@235 36 #ifdef HAVE_FISHSOUND
Chris@235 37 OggVorbisFileReader::getSupportedExtensions(extensions);
Chris@235 38 #endif
Chris@235 39 #endif
Chris@235 40
Chris@235 41 QString rv;
Chris@235 42 for (std::set<QString>::const_iterator i = extensions.begin();
Chris@235 43 i != extensions.end(); ++i) {
Chris@235 44 if (i != extensions.begin()) rv += " ";
Chris@235 45 rv += "*." + *i;
Chris@235 46 }
Chris@235 47
Chris@235 48 return rv;
Chris@235 49 }
Chris@235 50
Chris@235 51 AudioFileReader *
Chris@235 52 AudioFileReaderFactory::createReader(QString path)
Chris@235 53 {
Chris@235 54 QString err;
Chris@235 55
Chris@235 56 AudioFileReader *reader = 0;
Chris@235 57
Chris@241 58 // First try to construct a preferred reader based on the
Chris@241 59 // extension. If we can't identify one or it fails to load the
Chris@241 60 // file, fall back to trying all readers in no particular order.
Chris@241 61
Chris@241 62 QString ext = QFileInfo(path).suffix().toLower();
Chris@241 63 std::set<QString> extensions;
Chris@241 64
Chris@241 65 WavFileReader::getSupportedExtensions(extensions);
Chris@241 66 if (extensions.find(ext) != extensions.end()) {
Chris@241 67 reader = new WavFileReader(path);
Chris@241 68 }
Chris@241 69
Chris@241 70 #ifdef HAVE_MAD
Chris@241 71 if (!reader) {
Chris@241 72 extensions.clear();
Chris@241 73 MP3FileReader::getSupportedExtensions(extensions);
Chris@241 74 if (extensions.find(ext) != extensions.end()) {
Chris@241 75 reader = new MP3FileReader
Chris@263 76 (path,
Chris@263 77 MP3FileReader::DecodeAtOnce,
Chris@263 78 MP3FileReader::CacheInTemporaryFile);
Chris@241 79 }
Chris@241 80 }
Chris@241 81 #endif
Chris@241 82 #ifdef HAVE_OGGZ
Chris@241 83 #ifdef HAVE_FISHSOUND
Chris@241 84 if (!reader) {
Chris@241 85 extensions.clear();
Chris@241 86 OggVorbisFileReader::getSupportedExtensions(extensions);
Chris@241 87 if (extensions.find(ext) != extensions.end()) {
Chris@241 88 reader = new OggVorbisFileReader
Chris@263 89 (path,
Chris@263 90 OggVorbisFileReader::DecodeAtOnce,
Chris@263 91 OggVorbisFileReader::CacheInTemporaryFile);
Chris@241 92 }
Chris@241 93 }
Chris@241 94 #endif
Chris@241 95 #endif
Chris@241 96
Chris@241 97 if (reader) {
Chris@241 98 if (reader->isOK()) return reader;
Chris@241 99 if (reader->getError() != "") {
Chris@241 100 std::cerr << "AudioFileReaderFactory: Preferred reader for "
Chris@241 101 << "extension \"" << ext.toStdString() << "\" failed: \""
Chris@241 102 << reader->getError().toStdString() << "\"" << std::endl;
Chris@241 103 } else {
Chris@241 104 std::cerr << "AudioFileReaderFactory: Preferred reader for "
Chris@241 105 << "extension \"" << ext.toStdString() << "\" failed"
Chris@241 106 << std::endl;
Chris@241 107 }
Chris@241 108 delete reader;
Chris@241 109 reader = 0;
Chris@241 110 }
Chris@241 111
Chris@235 112 reader = new WavFileReader(path);
Chris@235 113 if (reader->isOK()) return reader;
Chris@241 114 if (reader->getError() != "") {
Chris@241 115 std::cerr << "AudioFileReaderFactory: WAV file reader error: \""
Chris@241 116 << reader->getError().toStdString() << "\"" << std::endl;
Chris@241 117 } else {
Chris@241 118 std::cerr << "AudioFileReaderFactory: WAV file reader failed"
Chris@241 119 << std::endl;
Chris@241 120 }
Chris@235 121 delete reader;
Chris@235 122
Chris@235 123 #ifdef HAVE_OGGZ
Chris@235 124 #ifdef HAVE_FISHSOUND
Chris@241 125 reader = new OggVorbisFileReader
Chris@263 126 (path,
Chris@263 127 OggVorbisFileReader::DecodeAtOnce,
Chris@263 128 OggVorbisFileReader::CacheInTemporaryFile);
Chris@235 129 if (reader->isOK()) return reader;
Chris@241 130 if (reader->getError() != "") {
Chris@241 131 std::cerr << "AudioFileReaderFactory: Ogg file reader error: \""
Chris@241 132 << reader->getError().toStdString() << "\"" << std::endl;
Chris@241 133 } else {
Chris@241 134 std::cerr << "AudioFileReaderFactory: Ogg file reader failed"
Chris@241 135 << std::endl;
Chris@241 136 }
Chris@235 137 delete reader;
Chris@235 138 #endif
Chris@235 139 #endif
Chris@235 140
Chris@235 141 #ifdef HAVE_MAD
Chris@241 142 reader = new MP3FileReader
Chris@263 143 (path,
Chris@263 144 MP3FileReader::DecodeAtOnce,
Chris@263 145 MP3FileReader::CacheInTemporaryFile);
Chris@235 146 if (reader->isOK()) return reader;
Chris@241 147 if (reader->getError() != "") {
Chris@241 148 std::cerr << "AudioFileReaderFactory: MP3 file reader error: \""
Chris@241 149 << reader->getError().toStdString() << "\"" << std::endl;
Chris@241 150 } else {
Chris@241 151 std::cerr << "AudioFileReaderFactory: MP3 file reader failed"
Chris@241 152 << std::endl;
Chris@241 153 }
Chris@235 154 delete reader;
Chris@235 155 #endif
Chris@235 156
Chris@235 157 return 0;
Chris@235 158 }
Chris@235 159