diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/multimedia/audio/qaudiodevicefactory.cpp | 2 | ||||
-rw-r--r-- | src/multimedia/audio/qaudioinput_mac_p.cpp | 76 | ||||
-rw-r--r-- | src/multimedia/audio/qaudioinput_mac_p.h | 5 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiosystem.h | 4 |
4 files changed, 73 insertions, 14 deletions
diff --git a/src/multimedia/audio/qaudiodevicefactory.cpp b/src/multimedia/audio/qaudiodevicefactory.cpp index 24972dd53..78b6911b5 100644 --- a/src/multimedia/audio/qaudiodevicefactory.cpp +++ b/src/multimedia/audio/qaudiodevicefactory.cpp @@ -106,6 +106,8 @@ public: QAudio::State state() const { return QAudio::StoppedState; } void setFormat(const QAudioFormat&) {} QAudioFormat format() const { return QAudioFormat(); } + void setVolume(qreal) {} + qreal volume() const {return 1.0f;} }; class QNullOutputDevice : public QAbstractAudioOutput diff --git a/src/multimedia/audio/qaudioinput_mac_p.cpp b/src/multimedia/audio/qaudioinput_mac_p.cpp index 7b427863c..483741da3 100644 --- a/src/multimedia/audio/qaudioinput_mac_p.cpp +++ b/src/multimedia/audio/qaudioinput_mac_p.cpp @@ -59,6 +59,7 @@ #include "qaudio_mac_p.h" #include "qaudioinput_mac_p.h" #include "qaudiodeviceinfo_mac_p.h" +#include "qaudiohelpers_p.h" QT_BEGIN_NAMESPACE @@ -235,7 +236,8 @@ public: m_deviceError(false), m_audioConverter(0), m_inputFormat(inputFormat), - m_outputFormat(outputFormat) + m_outputFormat(outputFormat), + m_volume(qreal(1.0f)) { m_maxPeriodSize = maxPeriodSize; m_periodTime = m_maxPeriodSize / m_outputFormat.mBytesPerFrame * 1000 / m_outputFormat.mSampleRate; @@ -253,6 +255,8 @@ public: m_audioConverter = 0; } } + + m_qFormat = toQAudioFormat(inputFormat); // we adjust volume before conversion } ~QAudioInputBuffer() @@ -260,6 +264,16 @@ public: delete m_buffer; } + qreal volume() const + { + return m_volume; + } + + void setVolume(qreal v) + { + m_volume = v; + } + qint64 renderFromDevice(AudioUnit audioUnit, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, @@ -279,6 +293,15 @@ public: inNumberFrames, m_inputBufferList->audioBufferList()); + // adjust volume, if necessary + if (!qFuzzyCompare(m_volume, qreal(1.0f))) { + QAudioHelperInternal::qMultiplySamples(m_volume, + m_qFormat, + m_inputBufferList->data(), /* input */ + m_inputBufferList->data(), /* output */ + m_inputBufferList->bufferSize()); + } + if (m_audioConverter != 0) { QAudioPacketFeeder feeder(m_inputBufferList); @@ -452,6 +475,8 @@ private: AudioConverterRef m_audioConverter; AudioStreamBasicDescription m_inputFormat; AudioStreamBasicDescription m_outputFormat; + QAudioFormat m_qFormat; + qreal m_volume; const static OSStatus as_empty = 'qtem'; @@ -535,6 +560,8 @@ QAudioInputPrivate::QAudioInputPrivate(const QByteArray& device) errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; + m_volume = qreal(1.0f); + intervalTimer = new QTimer(this); intervalTimer->setInterval(1000); connect(intervalTimer, SIGNAL(timeout()), SIGNAL(notify())); @@ -709,6 +736,7 @@ bool QAudioInputPrivate::open() streamFormat, this); + audioBuffer->setVolume(m_volume); audioIO = new QtMultimediaInternal::MacInputDevice(audioBuffer, this); // Init @@ -765,11 +793,11 @@ void QAudioInputPrivate::start(QIODevice* device) startTime = AudioGetCurrentHostTime(); totalFrames = 0; - audioThreadStart(); - - stateCode = QAudio::ActiveState; + stateCode = QAudio::IdleState; errorCode = QAudio::NoError; emit stateChanged(stateCode); + + audioThreadStart(); } QIODevice* QAudioInputPrivate::start() @@ -793,12 +821,12 @@ QIODevice* QAudioInputPrivate::start() startTime = AudioGetCurrentHostTime(); totalFrames = 0; - audioThreadStart(); - - stateCode = QAudio::ActiveState; + stateCode = QAudio::IdleState; errorCode = QAudio::NoError; emit stateChanged(stateCode); + audioThreadStart(); + return op; } @@ -823,6 +851,7 @@ void QAudioInputPrivate::reset() errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; + audioBuffer->reset(); QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } @@ -853,6 +882,8 @@ void QAudioInputPrivate::resume() int QAudioInputPrivate::bytesReady() const { + if (!audioBuffer) + return 0; return audioBuffer->used(); } @@ -910,6 +941,19 @@ QAudio::State QAudioInputPrivate::state() const return stateCode; } +qreal QAudioInputPrivate::volume() const +{ + return m_volume; +} + +void QAudioInputPrivate::setVolume(qreal volume) +{ + m_volume = volume; + if (audioBuffer) + audioBuffer->setVolume(m_volume); +} + + void QAudioInputPrivate::audioThreadStop() { stopTimers(); @@ -931,15 +975,22 @@ void QAudioInputPrivate::audioDeviceStop() threadFinished.wakeOne(); } +void QAudioInputPrivate::audioDeviceActive() +{ + QMutexLocker lock(&mutex); + if (stateCode == QAudio::IdleState) { + stateCode = QAudio::ActiveState; + QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); + } +} + void QAudioInputPrivate::audioDeviceFull() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState) { - audioDeviceStop(); - errorCode = QAudio::UnderrunError; stateCode = QAudio::IdleState; - QMetaObject::invokeMethod(this, "deviceStopped", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } @@ -998,9 +1049,10 @@ OSStatus QAudioInputPrivate::inputCallback(void* inRefCon, inBusNumber, inNumberFrames); - if (framesWritten > 0) + if (framesWritten > 0) { d->totalFrames += framesWritten; - else if (framesWritten == 0) + d->audioDeviceActive(); + } else if (framesWritten == 0) d->audioDeviceFull(); else if (framesWritten < 0) d->audioDeviceError(); diff --git a/src/multimedia/audio/qaudioinput_mac_p.h b/src/multimedia/audio/qaudioinput_mac_p.h index 2f9eb5803..f41b5cb0e 100644 --- a/src/multimedia/audio/qaudioinput_mac_p.h +++ b/src/multimedia/audio/qaudioinput_mac_p.h @@ -109,6 +109,7 @@ public: AudioStreamBasicDescription streamFormat; AudioStreamBasicDescription deviceFormat; QAbstractAudioDeviceInfo *audioDeviceInfo; + qreal m_volume; QAudioInputPrivate(const QByteArray& device); ~QAudioInputPrivate(); @@ -142,10 +143,14 @@ public: QAudio::Error error() const; QAudio::State state() const; + qreal volume() const; + void setVolume(qreal volume); + void audioThreadStart(); void audioThreadStop(); void audioDeviceStop(); + void audioDeviceActive(); void audioDeviceFull(); void audioDeviceError(); diff --git a/src/multimedia/audio/qaudiosystem.h b/src/multimedia/audio/qaudiosystem.h index e5ef8e44c..0fd2bc227 100644 --- a/src/multimedia/audio/qaudiosystem.h +++ b/src/multimedia/audio/qaudiosystem.h @@ -131,8 +131,8 @@ public: virtual QAudio::State state() const = 0; virtual void setFormat(const QAudioFormat& fmt) = 0; virtual QAudioFormat format() const = 0; - virtual void setVolume(qreal) {} - virtual qreal volume() const { return 1.0; } + virtual void setVolume(qreal) = 0; + virtual qreal volume() const = 0; Q_SIGNALS: void errorChanged(QAudio::Error); |