diff options
author | Michael Goddard <michael.goddard@nokia.com> | 2012-07-09 16:49:03 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-16 08:41:27 +0200 |
commit | 8c12864361dbcc7a49c682aaa4e6bca21eaacb5d (patch) | |
tree | b434f0e73ef9362885f8eeb456af2629080fabb3 /src/multimedia/audio | |
parent | f4e83a3a27d122abdae4b4ae31bd9728b76a954d (diff) |
Fix some QAudioInput errors on OSX.
Default buffer size wasn't always calculated correctly, and the timer
used in push mode was sometimes incorrect.
Change-Id: Ic31b9d16e16e4c25a5ebfc302590829e179a96bf
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
Diffstat (limited to 'src/multimedia/audio')
-rw-r--r-- | src/multimedia/audio/qaudioinput_mac_p.cpp | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/src/multimedia/audio/qaudioinput_mac_p.cpp b/src/multimedia/audio/qaudioinput_mac_p.cpp index d25ace900..7b427863c 100644 --- a/src/multimedia/audio/qaudioinput_mac_p.cpp +++ b/src/multimedia/audio/qaudioinput_mac_p.cpp @@ -239,7 +239,9 @@ public: { m_maxPeriodSize = maxPeriodSize; m_periodTime = m_maxPeriodSize / m_outputFormat.mBytesPerFrame * 1000 / m_outputFormat.mSampleRate; - m_buffer = new QAudioRingBuffer(bufferSize + (bufferSize % maxPeriodSize == 0 ? 0 : maxPeriodSize - (bufferSize % maxPeriodSize))); + + m_buffer = new QAudioRingBuffer(bufferSize); + m_inputBufferList = new QAudioBufferList(m_inputFormat); m_flushTimer = new QTimer(this); @@ -284,7 +286,7 @@ public: const int available = m_buffer->free(); while (err == noErr && !feeder.empty()) { - QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available); + QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available - copied); if (region.second == 0) break; @@ -368,7 +370,9 @@ public: void startFlushTimer() { if (m_device != 0) { - m_flushTimer->start((m_buffer->size() - (m_maxPeriodSize * 2)) / m_maxPeriodSize * m_periodTime); + // We use the period time for the timer, since that's + // around the buffer size (pre conversion >.>) + m_flushTimer->start(qMax(1, m_periodTime)); } } @@ -669,15 +673,37 @@ bool QAudioInputPrivate::open() return false; } - // Allocate buffer - periodSizeBytes = numberOfFrames * streamFormat.mBytesPerFrame; + AudioValueRange bufferRange; + size = sizeof(AudioValueRange); + + if (AudioUnitGetProperty(audioUnit, + kAudioDevicePropertyBufferFrameSizeRange, + kAudioUnitScope_Global, + 0, + &bufferRange, + &size) != noErr) { + qWarning() << "QAudioInput: Failed to get audio period size range"; + return false; + } + + // See if the requested buffer size is permissible + UInt32 frames = qBound((UInt32)bufferRange.mMinimum, internalBufferSize / streamFormat.mBytesPerFrame, (UInt32)bufferRange.mMaximum); + + // Set it back + if (AudioUnitSetProperty(audioUnit, + kAudioDevicePropertyBufferFrameSize, + kAudioUnitScope_Global, + 0, + &frames, + sizeof(UInt32)) != noErr) { + qWarning() << "QAudioInput: Failed to set audio buffer size"; + return false; + } - if (internalBufferSize < periodSizeBytes * 2) - internalBufferSize = periodSizeBytes * 2; - else - internalBufferSize -= internalBufferSize % streamFormat.mBytesPerFrame; + // Now allocate a few buffers to be safe. + periodSizeBytes = internalBufferSize = frames * streamFormat.mBytesPerFrame; - audioBuffer = new QtMultimediaInternal::QAudioInputBuffer(internalBufferSize, + audioBuffer = new QtMultimediaInternal::QAudioInputBuffer(internalBufferSize * 4, periodSizeBytes, deviceFormat, streamFormat, |