summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@digia.com>2014-03-02 18:44:52 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-03 15:55:00 +0100
commit775914ffb21bcdc6059e5867993b927a824d0cac (patch)
tree8a2fb92bcc8d9f33552a62e57333d5587e10350a
parent1f5b5cb47318536cefde004d2253d368c868140f (diff)
CoreAudio: Make it possible to set volume on of QAudioOutput
QAudioOutput::setVolume stopped working for CoreAudio when it was ported to live in it's own plugin. This was because it was not possible to set the volume of QAudioOutput in iOS. Now the functionality has been restored and added for iOS as well. For OS X we use the old method of setting the volume property of the AudioUnit. On iOS it is not possible to set the volume on a per AudioUnit basis, so we now manually modify the buffer contents (the same we do for QAudioInput already). Task-number: QTBUG-36756 Change-Id: I42b5892fe5534217043fa55e7b5b9a4ce824050d Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
-rw-r--r--src/plugins/coreaudio/coreaudiooutput.mm31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/plugins/coreaudio/coreaudiooutput.mm b/src/plugins/coreaudio/coreaudiooutput.mm
index bb0da57f3..e5e1c65e5 100644
--- a/src/plugins/coreaudio/coreaudiooutput.mm
+++ b/src/plugins/coreaudio/coreaudiooutput.mm
@@ -52,6 +52,10 @@
# include <CoreServices/CoreServices.h>
#endif
+#if defined(Q_OS_IOS)
+# include <QtMultimedia/private/qaudiohelpers_p.h>
+#endif
+
QT_BEGIN_NAMESPACE
static const int DEFAULT_BUFFER_SIZE = 8 * 1024;
@@ -430,13 +434,23 @@ QAudioFormat CoreAudioOutput::format() const
void CoreAudioOutput::setVolume(qreal volume)
{
const qreal normalizedVolume = qBound(qreal(0.0), volume, qreal(1.0));
- m_cachedVolume = normalizedVolume;
if (!m_isOpen) {
+ m_cachedVolume = normalizedVolume;
return;
}
- //TODO: actually set the output volume here
- //To set the output volume you need a handle to the mixer unit
+#if defined(Q_OS_OSX)
+ //on OS X the volume can be set directly on the AudioUnit
+ if (AudioUnitSetParameter(m_audioUnit,
+ kHALOutputParam_Volume,
+ kAudioUnitScope_Global,
+ 0 /* bus */,
+ (float)normalizedVolume,
+ 0) == noErr)
+ m_cachedVolume = normalizedVolume;
+#else
+ m_cachedVolume = normalizedVolume;
+#endif
}
qreal CoreAudioOutput::volume() const
@@ -497,6 +511,17 @@ OSStatus CoreAudioOutput::renderCallback(void *inRefCon, AudioUnitRenderActionFl
if (framesRead > 0) {
ioData->mBuffers[0].mDataByteSize = framesRead * bytesPerFrame;
d->m_totalFrames += framesRead;
+#ifdef Q_OS_IOS
+ // on iOS we have to adjust the sound volume ourselves
+ if (!qFuzzyCompare(d->m_cachedVolume, qreal(1.0f))) {
+ QAudioHelperInternal::qMultiplySamples(d->m_cachedVolume,
+ d->m_audioFormat,
+ ioData->mBuffers[0].mData, /* input */
+ ioData->mBuffers[0].mData, /* output */
+ ioData->mBuffers[0].mDataByteSize);
+ }
+#endif
+
}
else {
ioData->mBuffers[0].mDataByteSize = 0;