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