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
|
ivand_qmul@117
|
22 #include "VideoFileReader.h"
|
ivand_qmul@117
|
23 //
|
lbajardsilogic@0
|
24 #include <QString>
|
lbajardsilogic@0
|
25 #include <QFileInfo>
|
lbajardsilogic@0
|
26 #include <iostream>
|
lbajardsilogic@0
|
27
|
lbajardsilogic@0
|
28 QString
|
lbajardsilogic@0
|
29 AudioFileReaderFactory::getKnownExtensions()
|
lbajardsilogic@0
|
30 {
|
lbajardsilogic@0
|
31 std::set<QString> extensions;
|
lbajardsilogic@0
|
32
|
lbajardsilogic@0
|
33 WavFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
34 #ifdef HAVE_MAD
|
lbajardsilogic@0
|
35 MP3FileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
36 #endif
|
lbajardsilogic@0
|
37 #ifdef HAVE_OGGZ
|
lbajardsilogic@0
|
38 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@0
|
39 OggVorbisFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
40 #endif
|
lbajardsilogic@0
|
41 #endif
|
lbajardsilogic@0
|
42
|
lbajardsilogic@0
|
43 QString rv;
|
lbajardsilogic@0
|
44 for (std::set<QString>::const_iterator i = extensions.begin();
|
lbajardsilogic@0
|
45 i != extensions.end(); ++i) {
|
lbajardsilogic@0
|
46 if (i != extensions.begin()) rv += " ";
|
lbajardsilogic@0
|
47 rv += "*." + *i;
|
lbajardsilogic@0
|
48 }
|
lbajardsilogic@0
|
49
|
lbajardsilogic@0
|
50 return rv;
|
lbajardsilogic@0
|
51 }
|
lbajardsilogic@0
|
52
|
lbajardsilogic@85
|
53 bool AudioFileReaderFactory::isKnownExtensions(QString &extension)
|
lbajardsilogic@85
|
54 {
|
lbajardsilogic@85
|
55 bool isKnown = false;
|
lbajardsilogic@85
|
56
|
lbajardsilogic@85
|
57 std::set<QString> extensions;
|
lbajardsilogic@85
|
58
|
lbajardsilogic@85
|
59 WavFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@85
|
60 #ifdef HAVE_MAD
|
lbajardsilogic@85
|
61 MP3FileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@85
|
62 #endif
|
lbajardsilogic@85
|
63 #ifdef HAVE_OGGZ
|
lbajardsilogic@85
|
64 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@85
|
65 OggVorbisFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@85
|
66 #endif
|
lbajardsilogic@85
|
67 #endif
|
lbajardsilogic@85
|
68
|
lbajardsilogic@85
|
69 std::set<QString>::iterator iter = extensions.find(extension);
|
lbajardsilogic@85
|
70
|
lbajardsilogic@85
|
71 if (iter != extensions.end())
|
lbajardsilogic@85
|
72 {
|
lbajardsilogic@85
|
73 isKnown = true;
|
lbajardsilogic@85
|
74 }
|
lbajardsilogic@85
|
75
|
lbajardsilogic@85
|
76 return isKnown;
|
lbajardsilogic@85
|
77 }
|
lbajardsilogic@85
|
78
|
lbajardsilogic@0
|
79 AudioFileReader *
|
lbajardsilogic@0
|
80 AudioFileReaderFactory::createReader(QString path)
|
lbajardsilogic@0
|
81 {
|
lbajardsilogic@0
|
82 QString err;
|
lbajardsilogic@0
|
83
|
lbajardsilogic@0
|
84 AudioFileReader *reader = 0;
|
lbajardsilogic@0
|
85
|
lbajardsilogic@0
|
86 // First try to construct a preferred reader based on the
|
lbajardsilogic@0
|
87 // extension. If we can't identify one or it fails to load the
|
lbajardsilogic@0
|
88 // file, fall back to trying all readers in no particular order.
|
lbajardsilogic@0
|
89
|
lbajardsilogic@0
|
90 QString ext = QFileInfo(path).suffix().toLower();
|
lbajardsilogic@0
|
91 std::set<QString> extensions;
|
lbajardsilogic@0
|
92
|
lbajardsilogic@0
|
93 WavFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
94 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
95 reader = new WavFileReader(path);
|
lbajardsilogic@0
|
96 }
|
lbajardsilogic@0
|
97
|
lbajardsilogic@0
|
98 #ifdef HAVE_MAD
|
lbajardsilogic@0
|
99 if (!reader) {
|
lbajardsilogic@0
|
100 extensions.clear();
|
lbajardsilogic@0
|
101 MP3FileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
102 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
103 reader = new MP3FileReader
|
lbajardsilogic@0
|
104 (path, true, MP3FileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
105 }
|
lbajardsilogic@0
|
106 }
|
lbajardsilogic@0
|
107 #endif
|
lbajardsilogic@0
|
108 #ifdef HAVE_OGGZ
|
lbajardsilogic@0
|
109 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@0
|
110 if (!reader) {
|
lbajardsilogic@0
|
111 extensions.clear();
|
lbajardsilogic@0
|
112 OggVorbisFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
113 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
114 reader = new OggVorbisFileReader
|
lbajardsilogic@0
|
115 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
116 }
|
lbajardsilogic@0
|
117 }
|
lbajardsilogic@0
|
118 #endif
|
lbajardsilogic@0
|
119 #endif
|
ivand_qmul@117
|
120 //Ivan Damnjanovic 09-10/2007 added video support
|
ivand_qmul@117
|
121 #ifdef HAVE_FFMPEG
|
ivand_qmul@117
|
122 if (!reader) {
|
ivand_qmul@117
|
123 extensions.clear();
|
ivand_qmul@117
|
124 VideoFileReader::getSupportedExtensions(extensions);
|
ivand_qmul@117
|
125 if (extensions.find(ext) != extensions.end()) {
|
ivand_qmul@117
|
126
|
ivand_qmul@117
|
127 reader = new VideoFileReader
|
ivand_qmul@117
|
128 (path, true, VideoFileReader::CacheInTemporaryFile);
|
ivand_qmul@117
|
129 }
|
ivand_qmul@117
|
130 }
|
ivand_qmul@117
|
131 #endif
|
ivand_qmul@117
|
132 //
|
lbajardsilogic@0
|
133 if (reader) {
|
lbajardsilogic@0
|
134 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
135 if (reader->getError() != "") {
|
lbajardsilogic@0
|
136 std::cerr << "AudioFileReaderFactory: Preferred reader for "
|
lbajardsilogic@0
|
137 << "extension \"" << ext.toStdString() << "\" failed: \""
|
lbajardsilogic@0
|
138 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
139 } else {
|
lbajardsilogic@0
|
140 std::cerr << "AudioFileReaderFactory: Preferred reader for "
|
lbajardsilogic@0
|
141 << "extension \"" << ext.toStdString() << "\" failed"
|
lbajardsilogic@0
|
142 << std::endl;
|
lbajardsilogic@0
|
143 }
|
lbajardsilogic@0
|
144 delete reader;
|
lbajardsilogic@0
|
145 reader = 0;
|
lbajardsilogic@0
|
146 }
|
lbajardsilogic@0
|
147
|
lbajardsilogic@0
|
148 reader = new WavFileReader(path);
|
lbajardsilogic@0
|
149 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
150 if (reader->getError() != "") {
|
lbajardsilogic@0
|
151 std::cerr << "AudioFileReaderFactory: WAV file reader error: \""
|
lbajardsilogic@0
|
152 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
153 } else {
|
lbajardsilogic@0
|
154 std::cerr << "AudioFileReaderFactory: WAV file reader failed"
|
lbajardsilogic@0
|
155 << std::endl;
|
lbajardsilogic@0
|
156 }
|
lbajardsilogic@0
|
157 delete reader;
|
lbajardsilogic@0
|
158
|
lbajardsilogic@0
|
159 #ifdef HAVE_OGGZ
|
lbajardsilogic@0
|
160 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@0
|
161 reader = new OggVorbisFileReader
|
lbajardsilogic@0
|
162 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
163 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
164 if (reader->getError() != "") {
|
lbajardsilogic@0
|
165 std::cerr << "AudioFileReaderFactory: Ogg file reader error: \""
|
lbajardsilogic@0
|
166 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
167 } else {
|
lbajardsilogic@0
|
168 std::cerr << "AudioFileReaderFactory: Ogg file reader failed"
|
lbajardsilogic@0
|
169 << std::endl;
|
lbajardsilogic@0
|
170 }
|
lbajardsilogic@0
|
171 delete reader;
|
lbajardsilogic@0
|
172 #endif
|
lbajardsilogic@0
|
173 #endif
|
lbajardsilogic@0
|
174
|
lbajardsilogic@0
|
175 #ifdef HAVE_MAD
|
lbajardsilogic@0
|
176 reader = new MP3FileReader
|
lbajardsilogic@0
|
177 (path, true, MP3FileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
178 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
179 if (reader->getError() != "") {
|
lbajardsilogic@0
|
180 std::cerr << "AudioFileReaderFactory: MP3 file reader error: \""
|
lbajardsilogic@0
|
181 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
182 } else {
|
lbajardsilogic@0
|
183 std::cerr << "AudioFileReaderFactory: MP3 file reader failed"
|
lbajardsilogic@0
|
184 << std::endl;
|
lbajardsilogic@0
|
185 }
|
lbajardsilogic@0
|
186 delete reader;
|
lbajardsilogic@0
|
187 #endif
|
lbajardsilogic@0
|
188
|
lbajardsilogic@0
|
189 return 0;
|
lbajardsilogic@0
|
190 }
|
lbajardsilogic@0
|
191
|