summaryrefslogtreecommitdiffstats
path: root/src/multimedia/audio
diff options
context:
space:
mode:
authorMichael Goddard <michael.goddard@nokia.com>2012-07-09 16:49:03 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-16 08:41:27 +0200
commit8c12864361dbcc7a49c682aaa4e6bca21eaacb5d (patch)
treeb434f0e73ef9362885f8eeb456af2629080fabb3 /src/multimedia/audio
parentf4e83a3a27d122abdae4b4ae31bd9728b76a954d (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.cpp46
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,