annotate data/fileio/AudioFileReaderFactory.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents be6d31baecb9
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "AudioFileReaderFactory.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "WavFileReader.h"
lbajardsilogic@0 19 #include "OggVorbisFileReader.h"
lbajardsilogic@0 20 #include "MP3FileReader.h"
ivand_qmul@117 21 //Ivan Damnjanovic 09-10/2007 added Video reader and control header
lbajardsilogic@191 22 #ifdef HAVE_FFMPEG
ivand_qmul@117 23 #include "VideoFileReader.h"
lbajardsilogic@191 24 #endif
ivand_qmul@117 25 //
lbajardsilogic@0 26 #include <QString>
lbajardsilogic@0 27 #include <QFileInfo>
lbajardsilogic@0 28 #include <iostream>
lbajardsilogic@0 29
lbajardsilogic@0 30 QString
lbajardsilogic@0 31 AudioFileReaderFactory::getKnownExtensions()
lbajardsilogic@0 32 {
lbajardsilogic@0 33 std::set<QString> extensions;
lbajardsilogic@0 34
lbajardsilogic@0 35 WavFileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 36 #ifdef HAVE_MAD
lbajardsilogic@0 37 MP3FileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 38 #endif
lbajardsilogic@0 39 #ifdef HAVE_OGGZ
lbajardsilogic@0 40 #ifdef HAVE_FISHSOUND
lbajardsilogic@0 41 OggVorbisFileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 42 #endif
lbajardsilogic@0 43 #endif
lbajardsilogic@0 44
lbajardsilogic@0 45 QString rv;
lbajardsilogic@0 46 for (std::set<QString>::const_iterator i = extensions.begin();
lbajardsilogic@0 47 i != extensions.end(); ++i) {
lbajardsilogic@0 48 if (i != extensions.begin()) rv += " ";
lbajardsilogic@0 49 rv += "*." + *i;
lbajardsilogic@0 50 }
lbajardsilogic@0 51
lbajardsilogic@0 52 return rv;
lbajardsilogic@0 53 }
lbajardsilogic@0 54
lbajardsilogic@85 55 bool AudioFileReaderFactory::isKnownExtensions(QString &extension)
lbajardsilogic@85 56 {
lbajardsilogic@85 57 bool isKnown = false;
lbajardsilogic@85 58
lbajardsilogic@85 59 std::set<QString> extensions;
lbajardsilogic@85 60
lbajardsilogic@85 61 WavFileReader::getSupportedExtensions(extensions);
lbajardsilogic@85 62 #ifdef HAVE_MAD
lbajardsilogic@85 63 MP3FileReader::getSupportedExtensions(extensions);
lbajardsilogic@85 64 #endif
lbajardsilogic@85 65 #ifdef HAVE_OGGZ
lbajardsilogic@85 66 #ifdef HAVE_FISHSOUND
lbajardsilogic@85 67 OggVorbisFileReader::getSupportedExtensions(extensions);
lbajardsilogic@85 68 #endif
lbajardsilogic@85 69 #endif
lbajardsilogic@85 70
lbajardsilogic@85 71 std::set<QString>::iterator iter = extensions.find(extension);
lbajardsilogic@85 72
lbajardsilogic@85 73 if (iter != extensions.end())
lbajardsilogic@85 74 {
lbajardsilogic@85 75 isKnown = true;
lbajardsilogic@85 76 }
lbajardsilogic@85 77
lbajardsilogic@85 78 return isKnown;
lbajardsilogic@85 79 }
lbajardsilogic@85 80
lbajardsilogic@0 81 AudioFileReader *
lbajardsilogic@0 82 AudioFileReaderFactory::createReader(QString path)
lbajardsilogic@0 83 {
lbajardsilogic@0 84 QString err;
lbajardsilogic@0 85
lbajardsilogic@0 86 AudioFileReader *reader = 0;
lbajardsilogic@0 87
lbajardsilogic@0 88 // First try to construct a preferred reader based on the
lbajardsilogic@0 89 // extension. If we can't identify one or it fails to load the
lbajardsilogic@0 90 // file, fall back to trying all readers in no particular order.
lbajardsilogic@0 91
lbajardsilogic@0 92 QString ext = QFileInfo(path).suffix().toLower();
lbajardsilogic@0 93 std::set<QString> extensions;
lbajardsilogic@0 94
lbajardsilogic@0 95 WavFileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 96 if (extensions.find(ext) != extensions.end()) {
lbajardsilogic@0 97 reader = new WavFileReader(path);
lbajardsilogic@0 98 }
lbajardsilogic@0 99
lbajardsilogic@0 100 #ifdef HAVE_MAD
lbajardsilogic@0 101 if (!reader) {
lbajardsilogic@0 102 extensions.clear();
lbajardsilogic@0 103 MP3FileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 104 if (extensions.find(ext) != extensions.end()) {
lbajardsilogic@0 105 reader = new MP3FileReader
lbajardsilogic@0 106 (path, true, MP3FileReader::CacheInTemporaryFile);
lbajardsilogic@0 107 }
lbajardsilogic@0 108 }
lbajardsilogic@0 109 #endif
lbajardsilogic@0 110 #ifdef HAVE_OGGZ
lbajardsilogic@0 111 #ifdef HAVE_FISHSOUND
lbajardsilogic@0 112 if (!reader) {
lbajardsilogic@0 113 extensions.clear();
lbajardsilogic@0 114 OggVorbisFileReader::getSupportedExtensions(extensions);
lbajardsilogic@0 115 if (extensions.find(ext) != extensions.end()) {
lbajardsilogic@0 116 reader = new OggVorbisFileReader
lbajardsilogic@0 117 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
lbajardsilogic@0 118 }
lbajardsilogic@0 119 }
lbajardsilogic@0 120 #endif
lbajardsilogic@0 121 #endif
ivand_qmul@117 122 //Ivan Damnjanovic 09-10/2007 added video support
ivand_qmul@117 123 #ifdef HAVE_FFMPEG
ivand_qmul@117 124 if (!reader) {
ivand_qmul@117 125 extensions.clear();
ivand_qmul@117 126 VideoFileReader::getSupportedExtensions(extensions);
ivand_qmul@117 127 if (extensions.find(ext) != extensions.end()) {
ivand_qmul@117 128
ivand_qmul@117 129 reader = new VideoFileReader
ivand_qmul@117 130 (path, true, VideoFileReader::CacheInTemporaryFile);
ivand_qmul@117 131 }
ivand_qmul@117 132 }
ivand_qmul@117 133 #endif
ivand_qmul@117 134 //
lbajardsilogic@0 135 if (reader) {
lbajardsilogic@0 136 if (reader->isOK()) return reader;
lbajardsilogic@0 137 if (reader->getError() != "") {
lbajardsilogic@0 138 std::cerr << "AudioFileReaderFactory: Preferred reader for "
lbajardsilogic@0 139 << "extension \"" << ext.toStdString() << "\" failed: \""
lbajardsilogic@0 140 << reader->getError().toStdString() << "\"" << std::endl;
lbajardsilogic@0 141 } else {
lbajardsilogic@0 142 std::cerr << "AudioFileReaderFactory: Preferred reader for "
lbajardsilogic@0 143 << "extension \"" << ext.toStdString() << "\" failed"
lbajardsilogic@0 144 << std::endl;
lbajardsilogic@0 145 }
lbajardsilogic@0 146 delete reader;
lbajardsilogic@0 147 reader = 0;
lbajardsilogic@0 148 }
lbajardsilogic@0 149
lbajardsilogic@0 150 reader = new WavFileReader(path);
lbajardsilogic@0 151 if (reader->isOK()) return reader;
lbajardsilogic@0 152 if (reader->getError() != "") {
lbajardsilogic@0 153 std::cerr << "AudioFileReaderFactory: WAV file reader error: \""
lbajardsilogic@0 154 << reader->getError().toStdString() << "\"" << std::endl;
lbajardsilogic@0 155 } else {
lbajardsilogic@0 156 std::cerr << "AudioFileReaderFactory: WAV file reader failed"
lbajardsilogic@0 157 << std::endl;
lbajardsilogic@0 158 }
lbajardsilogic@0 159 delete reader;
lbajardsilogic@0 160
lbajardsilogic@0 161 #ifdef HAVE_OGGZ
lbajardsilogic@0 162 #ifdef HAVE_FISHSOUND
lbajardsilogic@0 163 reader = new OggVorbisFileReader
lbajardsilogic@0 164 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
lbajardsilogic@0 165 if (reader->isOK()) return reader;
lbajardsilogic@0 166 if (reader->getError() != "") {
lbajardsilogic@0 167 std::cerr << "AudioFileReaderFactory: Ogg file reader error: \""
lbajardsilogic@0 168 << reader->getError().toStdString() << "\"" << std::endl;
lbajardsilogic@0 169 } else {
lbajardsilogic@0 170 std::cerr << "AudioFileReaderFactory: Ogg file reader failed"
lbajardsilogic@0 171 << std::endl;
lbajardsilogic@0 172 }
lbajardsilogic@0 173 delete reader;
lbajardsilogic@0 174 #endif
lbajardsilogic@0 175 #endif
lbajardsilogic@0 176
lbajardsilogic@0 177 #ifdef HAVE_MAD
lbajardsilogic@0 178 reader = new MP3FileReader
lbajardsilogic@0 179 (path, true, MP3FileReader::CacheInTemporaryFile);
lbajardsilogic@0 180 if (reader->isOK()) return reader;
lbajardsilogic@0 181 if (reader->getError() != "") {
lbajardsilogic@0 182 std::cerr << "AudioFileReaderFactory: MP3 file reader error: \""
lbajardsilogic@0 183 << reader->getError().toStdString() << "\"" << std::endl;
lbajardsilogic@0 184 } else {
lbajardsilogic@0 185 std::cerr << "AudioFileReaderFactory: MP3 file reader failed"
lbajardsilogic@0 186 << std::endl;
lbajardsilogic@0 187 }
lbajardsilogic@0 188 delete reader;
lbajardsilogic@0 189 #endif
lbajardsilogic@0 190
lbajardsilogic@0 191 return 0;
lbajardsilogic@0 192 }
lbajardsilogic@0 193