257 AudioUnitRenderActionFlags* ioActionFlags, |
262 AudioUnitRenderActionFlags* ioActionFlags, |
258 const AudioTimeStamp* inTimeStamp, |
263 const AudioTimeStamp* inTimeStamp, |
259 UInt32 inBusNumber, |
264 UInt32 inBusNumber, |
260 UInt32 inNumberFrames) |
265 UInt32 inNumberFrames) |
261 { |
266 { |
262 const bool wasEmpty = m_buffer->used() == 0; |
267 const bool pullMode = m_device == 0; |
263 |
268 |
264 OSStatus err; |
269 OSStatus err; |
265 qint64 framesRendered = 0; |
270 qint64 framesRendered = 0; |
266 |
271 |
267 m_inputBufferList->reset(); |
272 m_inputBufferList->reset(); |
273 m_inputBufferList->audioBufferList()); |
278 m_inputBufferList->audioBufferList()); |
274 |
279 |
275 if (m_audioConverter != 0) { |
280 if (m_audioConverter != 0) { |
276 QAudioPacketFeeder feeder(m_inputBufferList); |
281 QAudioPacketFeeder feeder(m_inputBufferList); |
277 |
282 |
278 bool wecan = true; |
|
279 int copied = 0; |
283 int copied = 0; |
280 |
|
281 const int available = m_buffer->free(); |
284 const int available = m_buffer->free(); |
282 |
285 |
283 while (err == noErr && wecan) { |
286 while (err == noErr && !feeder.empty()) { |
284 QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available); |
287 QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available); |
285 |
288 |
286 if (region.second > 0) { |
289 if (region.second == 0) |
287 AudioBufferList output; |
290 break; |
288 output.mNumberBuffers = 1; |
291 |
289 output.mBuffers[0].mNumberChannels = 1; |
292 AudioBufferList output; |
290 output.mBuffers[0].mDataByteSize = region.second; |
293 output.mNumberBuffers = 1; |
291 output.mBuffers[0].mData = region.first; |
294 output.mBuffers[0].mNumberChannels = 1; |
292 |
295 output.mBuffers[0].mDataByteSize = region.second; |
293 UInt32 packetSize = region.second / m_outputFormat.mBytesPerPacket; |
296 output.mBuffers[0].mData = region.first; |
294 err = AudioConverterFillComplexBuffer(m_audioConverter, |
297 |
295 converterCallback, |
298 UInt32 packetSize = region.second / m_outputFormat.mBytesPerPacket; |
296 &feeder, |
299 err = AudioConverterFillComplexBuffer(m_audioConverter, |
297 &packetSize, |
300 converterCallback, |
298 &output, |
301 &feeder, |
299 0); |
302 &packetSize, |
300 |
303 &output, |
301 region.second = output.mBuffers[0].mDataByteSize; |
304 0); |
302 copied += region.second; |
305 region.second = output.mBuffers[0].mDataByteSize; |
303 |
306 copied += region.second; |
304 m_buffer->releaseWriteRegion(region); |
307 |
305 } |
308 m_buffer->releaseWriteRegion(region); |
306 else |
|
307 wecan = false; |
|
308 } |
309 } |
309 |
310 |
310 framesRendered += copied / m_outputFormat.mBytesPerFrame; |
311 framesRendered += copied / m_outputFormat.mBytesPerFrame; |
311 } |
312 } |
312 else { |
313 else { |