25 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__) 26 #include <AudioToolbox/AudioToolbox.h> 27 #include <AudioToolbox/ExtendedAudioFile.h> 29 #include "AudioToolbox.h" 30 #include "ExtendedAudioFile.h" 33 class CoreAudioFileReader::D
36 D() : blockSize(1024), valid(false) { }
39 AudioBufferList buffer;
41 AudioStreamBasicDescription asbd;
51 text[0] = (uerr >> 24) & 0xff;
52 text[1] = (uerr >> 16) & 0xff;
53 text[2] = (uerr >> 8) & 0xff;
54 text[3] = (uerr) & 0xff;
56 return QString(
"%1 (%2)").arg(err).arg(QString::fromLocal8Bit(text));
59 CoreAudioFileReader::CoreAudioFileReader(
FileSource source,
60 DecodeMode decodeMode,
67 m_path(source.getLocalFilename()),
77 m_d->buffer.mBuffers[0].mData = 0;
79 Profiler profiler(
"CoreAudioFileReader::CoreAudioFileReader",
true);
81 SVDEBUG <<
"CoreAudioFileReader: path is \"" << m_path <<
"\"" << endl;
83 QByteArray ba = m_path.toLocal8Bit();
85 CFURLRef url = CFURLCreateFromFileSystemRepresentation
87 (
const UInt8 *)ba.data(),
101 m_d->err = ExtAudioFileOpenURL(url, &m_d->file);
107 m_error =
"CoreAudioReadStream: Error opening file: code " + codestr(m_d->err);
111 m_error =
"CoreAudioReadStream: Failed to open file, but no error reported!";
115 UInt32 propsize =
sizeof(AudioStreamBasicDescription);
116 m_d->err = ExtAudioFileGetProperty
117 (m_d->file, kExtAudioFileProperty_FileDataFormat, &propsize, &m_d->asbd);
120 m_error =
"CoreAudioReadStream: Error in getting basic description: code " + codestr(m_d->err);
121 ExtAudioFileDispose(m_d->file);
125 m_channelCount = m_d->asbd.mChannelsPerFrame;
126 m_fileRate = m_d->asbd.mSampleRate;
128 cerr <<
"CoreAudioReadStream: " << m_channelCount <<
" channels, " << m_fileRate <<
" Hz" << endl;
130 m_d->asbd.mFormatID = kAudioFormatLinearPCM;
131 m_d->asbd.mFormatFlags =
132 kAudioFormatFlagIsFloat |
133 kAudioFormatFlagIsPacked |
134 kAudioFormatFlagsNativeEndian;
135 m_d->asbd.mBitsPerChannel =
sizeof(float) * 8;
136 m_d->asbd.mBytesPerFrame =
sizeof(float) * m_channelCount;
137 m_d->asbd.mBytesPerPacket =
sizeof(float) * m_channelCount;
138 m_d->asbd.mFramesPerPacket = 1;
139 m_d->asbd.mReserved = 0;
141 m_d->err = ExtAudioFileSetProperty
142 (m_d->file, kExtAudioFileProperty_ClientDataFormat, propsize, &m_d->asbd);
145 m_error =
"CoreAudioReadStream: Error in setting client format: code " + codestr(m_d->err);
146 ExtAudioFileDispose(m_d->file);
150 m_d->buffer.mNumberBuffers = 1;
151 m_d->buffer.mBuffers[0].mNumberChannels = m_channelCount;
152 m_d->buffer.mBuffers[0].mDataByteSize =
sizeof(float) * m_channelCount * m_d->blockSize;
153 m_d->buffer.mBuffers[0].mData =
new float[m_channelCount * m_d->blockSize];
157 initialiseDecodeCache();
160 connect(m_reporter, SIGNAL(cancelled()),
this, SLOT(cancelled()));
161 m_reporter->setMessage
162 (tr(
"Decoding %1...").arg(QFileInfo(m_path).fileName()));
167 UInt32 framesRead = m_d->blockSize;
168 m_d->err = ExtAudioFileRead(m_d->file, &framesRead, &m_d->buffer);
171 m_error = QString(
"Error in CoreAudio decoding: code %1")
181 addSamplesToDecodeCache((
float *)m_d->buffer.mBuffers[0].mData, framesRead);
183 if (framesRead < m_d->blockSize)
break;
193 CoreAudioFileReader::~CoreAudioFileReader()
195 cerr <<
"CoreAudioFileReader::~CoreAudioFileReader" << endl;
198 ExtAudioFileDispose(m_d->file);
199 delete[] m_d->buffer.mBuffers[0].mData;
206 CoreAudioFileReader::cancelled()
212 CoreAudioFileReader::getSupportedExtensions(std::set<QString> &extensions)
214 extensions.insert(
"aiff");
215 extensions.insert(
"aif");
216 extensions.insert(
"au");
217 extensions.insert(
"m4a");
218 extensions.insert(
"m4b");
219 extensions.insert(
"m4p");
220 extensions.insert(
"mp3");
221 extensions.insert(
"mp4");
222 extensions.insert(
"wav");
226 CoreAudioFileReader::supportsExtension(QString extension)
228 std::set<QString> extensions;
229 getSupportedExtensions(extensions);
230 return (extensions.find(extension.toLower()) != extensions.end());
234 CoreAudioFileReader::supportsContentType(QString type)
236 return (type ==
"audio/x-aiff" ||
237 type ==
"audio/x-wav" ||
238 type ==
"audio/mpeg" ||
239 type ==
"audio/basic" ||
240 type ==
"audio/x-aac");
244 CoreAudioFileReader::supports(
FileSource &source)
QString getExtension() const
Return the file extension for this file, if any.
FileSource is a class used to refer to the contents of a file that may be either local or at a remote...
QString getContentType() const
Return the MIME content type of this file, if known.
Profile point instance class.