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
|