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@0
|
51 AudioFileReader *
|
lbajardsilogic@0
|
52 AudioFileReaderFactory::createReader(QString path)
|
lbajardsilogic@0
|
53 {
|
lbajardsilogic@0
|
54 QString err;
|
lbajardsilogic@0
|
55
|
lbajardsilogic@0
|
56 AudioFileReader *reader = 0;
|
lbajardsilogic@0
|
57
|
lbajardsilogic@0
|
58 // First try to construct a preferred reader based on the
|
lbajardsilogic@0
|
59 // extension. If we can't identify one or it fails to load the
|
lbajardsilogic@0
|
60 // file, fall back to trying all readers in no particular order.
|
lbajardsilogic@0
|
61
|
lbajardsilogic@0
|
62 QString ext = QFileInfo(path).suffix().toLower();
|
lbajardsilogic@0
|
63 std::set<QString> extensions;
|
lbajardsilogic@0
|
64
|
lbajardsilogic@0
|
65 WavFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
66 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
67 reader = new WavFileReader(path);
|
lbajardsilogic@0
|
68 }
|
lbajardsilogic@0
|
69
|
lbajardsilogic@0
|
70 #ifdef HAVE_MAD
|
lbajardsilogic@0
|
71 if (!reader) {
|
lbajardsilogic@0
|
72 extensions.clear();
|
lbajardsilogic@0
|
73 MP3FileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
74 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
75 reader = new MP3FileReader
|
lbajardsilogic@0
|
76 (path, true, MP3FileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
77 }
|
lbajardsilogic@0
|
78 }
|
lbajardsilogic@0
|
79 #endif
|
lbajardsilogic@0
|
80 #ifdef HAVE_OGGZ
|
lbajardsilogic@0
|
81 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@0
|
82 if (!reader) {
|
lbajardsilogic@0
|
83 extensions.clear();
|
lbajardsilogic@0
|
84 OggVorbisFileReader::getSupportedExtensions(extensions);
|
lbajardsilogic@0
|
85 if (extensions.find(ext) != extensions.end()) {
|
lbajardsilogic@0
|
86 reader = new OggVorbisFileReader
|
lbajardsilogic@0
|
87 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
88 }
|
lbajardsilogic@0
|
89 }
|
lbajardsilogic@0
|
90 #endif
|
lbajardsilogic@0
|
91 #endif
|
lbajardsilogic@0
|
92
|
lbajardsilogic@0
|
93 if (reader) {
|
lbajardsilogic@0
|
94 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
95 if (reader->getError() != "") {
|
lbajardsilogic@0
|
96 std::cerr << "AudioFileReaderFactory: Preferred reader for "
|
lbajardsilogic@0
|
97 << "extension \"" << ext.toStdString() << "\" failed: \""
|
lbajardsilogic@0
|
98 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
99 } else {
|
lbajardsilogic@0
|
100 std::cerr << "AudioFileReaderFactory: Preferred reader for "
|
lbajardsilogic@0
|
101 << "extension \"" << ext.toStdString() << "\" failed"
|
lbajardsilogic@0
|
102 << std::endl;
|
lbajardsilogic@0
|
103 }
|
lbajardsilogic@0
|
104 delete reader;
|
lbajardsilogic@0
|
105 reader = 0;
|
lbajardsilogic@0
|
106 }
|
lbajardsilogic@0
|
107
|
lbajardsilogic@0
|
108 reader = new WavFileReader(path);
|
lbajardsilogic@0
|
109 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
110 if (reader->getError() != "") {
|
lbajardsilogic@0
|
111 std::cerr << "AudioFileReaderFactory: WAV file reader error: \""
|
lbajardsilogic@0
|
112 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
113 } else {
|
lbajardsilogic@0
|
114 std::cerr << "AudioFileReaderFactory: WAV file reader failed"
|
lbajardsilogic@0
|
115 << std::endl;
|
lbajardsilogic@0
|
116 }
|
lbajardsilogic@0
|
117 delete reader;
|
lbajardsilogic@0
|
118
|
lbajardsilogic@0
|
119 #ifdef HAVE_OGGZ
|
lbajardsilogic@0
|
120 #ifdef HAVE_FISHSOUND
|
lbajardsilogic@0
|
121 reader = new OggVorbisFileReader
|
lbajardsilogic@0
|
122 (path, true, OggVorbisFileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
123 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
124 if (reader->getError() != "") {
|
lbajardsilogic@0
|
125 std::cerr << "AudioFileReaderFactory: Ogg file reader error: \""
|
lbajardsilogic@0
|
126 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
127 } else {
|
lbajardsilogic@0
|
128 std::cerr << "AudioFileReaderFactory: Ogg file reader failed"
|
lbajardsilogic@0
|
129 << std::endl;
|
lbajardsilogic@0
|
130 }
|
lbajardsilogic@0
|
131 delete reader;
|
lbajardsilogic@0
|
132 #endif
|
lbajardsilogic@0
|
133 #endif
|
lbajardsilogic@0
|
134
|
lbajardsilogic@0
|
135 #ifdef HAVE_MAD
|
lbajardsilogic@0
|
136 reader = new MP3FileReader
|
lbajardsilogic@0
|
137 (path, true, MP3FileReader::CacheInTemporaryFile);
|
lbajardsilogic@0
|
138 if (reader->isOK()) return reader;
|
lbajardsilogic@0
|
139 if (reader->getError() != "") {
|
lbajardsilogic@0
|
140 std::cerr << "AudioFileReaderFactory: MP3 file reader error: \""
|
lbajardsilogic@0
|
141 << reader->getError().toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
142 } else {
|
lbajardsilogic@0
|
143 std::cerr << "AudioFileReaderFactory: MP3 file reader failed"
|
lbajardsilogic@0
|
144 << std::endl;
|
lbajardsilogic@0
|
145 }
|
lbajardsilogic@0
|
146 delete reader;
|
lbajardsilogic@0
|
147 #endif
|
lbajardsilogic@0
|
148
|
lbajardsilogic@0
|
149 return 0;
|
lbajardsilogic@0
|
150 }
|
lbajardsilogic@0
|
151
|