Mercurial > hg > svcore
comparison data/fileio/AudioFileReaderFactory.cpp @ 297:c022976d18e8
* Merge from sv-match-alignment branch (excluding alignment-specific document).
- add aggregate wave model (not yet complete enough to be added as a true
model in a layer, but there's potential)
- add play solo mode
- add alignment model -- unused in plain SV
- fix two plugin leaks
- add m3u playlist support (opens all files at once, potentially hazardous)
- fix retrieval of pre-encoded URLs
- add ability to resample audio files on import, so as to match rates with
other files previously loaded; add preference for same
- add preliminary support in transform code for range and rate of transform
input
- reorganise preferences dialog, move dark-background option to preferences,
add option for temporary directory location
author | Chris Cannam |
---|---|
date | Fri, 28 Sep 2007 13:56:38 +0000 |
parents | 92e8dbde73cd |
children | 14e0f60435b8 |
comparison
equal
deleted
inserted
replaced
296:2b6c99b607f1 | 297:c022976d18e8 |
---|---|
14 */ | 14 */ |
15 | 15 |
16 #include "AudioFileReaderFactory.h" | 16 #include "AudioFileReaderFactory.h" |
17 | 17 |
18 #include "WavFileReader.h" | 18 #include "WavFileReader.h" |
19 #include "ResamplingWavFileReader.h" | |
19 #include "OggVorbisFileReader.h" | 20 #include "OggVorbisFileReader.h" |
20 #include "MP3FileReader.h" | 21 #include "MP3FileReader.h" |
21 #include "QuickTimeFileReader.h" | 22 #include "QuickTimeFileReader.h" |
22 | 23 |
23 #include <QString> | 24 #include <QString> |
51 | 52 |
52 return rv; | 53 return rv; |
53 } | 54 } |
54 | 55 |
55 AudioFileReader * | 56 AudioFileReader * |
56 AudioFileReaderFactory::createReader(QString path) | 57 AudioFileReaderFactory::createReader(QString path, size_t targetRate) |
57 { | 58 { |
58 QString err; | 59 QString err; |
60 | |
61 std::cerr << "AudioFileReaderFactory::createReader(\"" << path.toStdString() << "\"): Requested rate: " << targetRate << std::endl; | |
59 | 62 |
60 AudioFileReader *reader = 0; | 63 AudioFileReader *reader = 0; |
61 | 64 |
62 // First try to construct a preferred reader based on the | 65 // First try to construct a preferred reader based on the |
63 // extension. If we can't identify one or it fails to load the | 66 // extension. If we can't identify one or it fails to load the |
67 std::set<QString> extensions; | 70 std::set<QString> extensions; |
68 | 71 |
69 WavFileReader::getSupportedExtensions(extensions); | 72 WavFileReader::getSupportedExtensions(extensions); |
70 if (extensions.find(ext) != extensions.end()) { | 73 if (extensions.find(ext) != extensions.end()) { |
71 reader = new WavFileReader(path); | 74 reader = new WavFileReader(path); |
75 | |
76 if (targetRate != 0 && | |
77 reader->isOK() && | |
78 reader->getSampleRate() != targetRate) { | |
79 | |
80 std::cerr << "AudioFileReaderFactory::createReader: WAV file rate: " << reader->getSampleRate() << ", creating resampling reader" << std::endl; | |
81 | |
82 delete reader; | |
83 reader = new ResamplingWavFileReader | |
84 (path, | |
85 ResamplingWavFileReader::ResampleThreaded, | |
86 ResamplingWavFileReader::CacheInTemporaryFile, | |
87 targetRate); | |
88 } | |
72 } | 89 } |
73 | 90 |
74 #ifdef HAVE_OGGZ | 91 #ifdef HAVE_OGGZ |
75 #ifdef HAVE_FISHSOUND | 92 #ifdef HAVE_FISHSOUND |
76 if (!reader) { | 93 if (!reader) { |
78 OggVorbisFileReader::getSupportedExtensions(extensions); | 95 OggVorbisFileReader::getSupportedExtensions(extensions); |
79 if (extensions.find(ext) != extensions.end()) { | 96 if (extensions.find(ext) != extensions.end()) { |
80 reader = new OggVorbisFileReader | 97 reader = new OggVorbisFileReader |
81 (path, | 98 (path, |
82 OggVorbisFileReader::DecodeThreaded, | 99 OggVorbisFileReader::DecodeThreaded, |
83 OggVorbisFileReader::CacheInTemporaryFile); | 100 OggVorbisFileReader::CacheInTemporaryFile, |
101 targetRate); | |
84 } | 102 } |
85 } | 103 } |
86 #endif | 104 #endif |
87 #endif | 105 #endif |
88 | 106 |
92 MP3FileReader::getSupportedExtensions(extensions); | 110 MP3FileReader::getSupportedExtensions(extensions); |
93 if (extensions.find(ext) != extensions.end()) { | 111 if (extensions.find(ext) != extensions.end()) { |
94 reader = new MP3FileReader | 112 reader = new MP3FileReader |
95 (path, | 113 (path, |
96 MP3FileReader::DecodeThreaded, | 114 MP3FileReader::DecodeThreaded, |
97 MP3FileReader::CacheInTemporaryFile); | 115 MP3FileReader::CacheInTemporaryFile, |
116 targetRate); | |
98 } | 117 } |
99 } | 118 } |
100 #endif | 119 #endif |
101 | 120 |
102 #ifdef HAVE_QUICKTIME | 121 #ifdef HAVE_QUICKTIME |
105 QuickTimeFileReader::getSupportedExtensions(extensions); | 124 QuickTimeFileReader::getSupportedExtensions(extensions); |
106 if (extensions.find(ext) != extensions.end()) { | 125 if (extensions.find(ext) != extensions.end()) { |
107 reader = new QuickTimeFileReader | 126 reader = new QuickTimeFileReader |
108 (path, | 127 (path, |
109 QuickTimeFileReader::DecodeThreaded, | 128 QuickTimeFileReader::DecodeThreaded, |
110 QuickTimeFileReader::CacheInTemporaryFile); | 129 QuickTimeFileReader::CacheInTemporaryFile, |
130 targetRate); | |
111 } | 131 } |
112 } | 132 } |
113 #endif | 133 #endif |
114 | 134 |
115 if (reader) { | 135 if (reader) { |
126 delete reader; | 146 delete reader; |
127 reader = 0; | 147 reader = 0; |
128 } | 148 } |
129 | 149 |
130 reader = new WavFileReader(path); | 150 reader = new WavFileReader(path); |
131 if (reader->isOK()) return reader; | 151 |
152 if (targetRate != 0 && | |
153 reader->isOK() && | |
154 reader->getSampleRate() != targetRate) { | |
155 | |
156 delete reader; | |
157 reader = new ResamplingWavFileReader | |
158 (path, | |
159 ResamplingWavFileReader::ResampleThreaded, | |
160 ResamplingWavFileReader::CacheInTemporaryFile, | |
161 targetRate); | |
162 } | |
163 | |
164 if (reader->isOK()) return reader; | |
165 | |
132 if (reader->getError() != "") { | 166 if (reader->getError() != "") { |
133 std::cerr << "AudioFileReaderFactory: WAV file reader error: \"" | 167 std::cerr << "AudioFileReaderFactory: WAV file reader error: \"" |
134 << reader->getError().toStdString() << "\"" << std::endl; | 168 << reader->getError().toStdString() << "\"" << std::endl; |
135 } else { | 169 } else { |
136 std::cerr << "AudioFileReaderFactory: WAV file reader failed" | 170 std::cerr << "AudioFileReaderFactory: WAV file reader failed" |