diff options
author | hawcroft <derick.hawcroft@nokia.com> | 2011-09-28 13:20:26 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-28 05:33:38 +0200 |
commit | a645b75e35b2d545d4bd5c9f592f4efc9c303a11 (patch) | |
tree | b94edef32718aab8385fc49e23f87e7138974a90 | |
parent | 788175b4f490303fc658b7565a658b4c37c56317 (diff) |
Add QAudioOutput volume API and pulseaudio backend implementation.
Change-Id: I70784e8d17522a23f6467713d58384b30557694b
Reviewed-on: http://codereview.qt-project.org/5663
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: derick hawcroft <derick.hawcroft@nokia.com>
-rw-r--r-- | src/multimediakit/audio/qaudiooutput.cpp | 19 | ||||
-rw-r--r-- | src/multimediakit/audio/qaudiooutput.h | 3 | ||||
-rw-r--r-- | src/multimediakit/audio/qaudiosystem.cpp | 13 | ||||
-rw-r--r-- | src/multimediakit/audio/qaudiosystem.h | 2 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudiooutput_pulse.cpp | 50 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudiooutput_pulse.h | 7 |
6 files changed, 93 insertions, 1 deletions
diff --git a/src/multimediakit/audio/qaudiooutput.cpp b/src/multimediakit/audio/qaudiooutput.cpp index ea9dcb1..d4a2d7f 100644 --- a/src/multimediakit/audio/qaudiooutput.cpp +++ b/src/multimediakit/audio/qaudiooutput.cpp @@ -366,6 +366,25 @@ QAudio::State QAudioOutput::state() const } /*! + Sets the volume. + Where \a volume is between 0.0 and 1.0 inclusive. + \since 5.0 +*/ +void QAudioOutput::setVolume(qreal volume) +{ + d->setVolume(volume); +} + +/*! + Returns the volume between 0.0 and 1.0 inclusive. + \since 5.0 +*/ +qreal QAudioOutput::volume() const +{ + return d->volume(); +} + +/*! \fn QAudioOutput::stateChanged(QAudio::State state) This signal is emitted when the device \a state has changed. This is the current state of the audio output. diff --git a/src/multimediakit/audio/qaudiooutput.h b/src/multimediakit/audio/qaudiooutput.h index b61c4d9..f146c80 100644 --- a/src/multimediakit/audio/qaudiooutput.h +++ b/src/multimediakit/audio/qaudiooutput.h @@ -97,6 +97,9 @@ public: QAudio::Error error() const; QAudio::State state() const; + void setVolume(qreal); + qreal volume() const; + Q_SIGNALS: void stateChanged(QAudio::State); void notify(); diff --git a/src/multimediakit/audio/qaudiosystem.cpp b/src/multimediakit/audio/qaudiosystem.cpp index 4555be9..0c0475e 100644 --- a/src/multimediakit/audio/qaudiosystem.cpp +++ b/src/multimediakit/audio/qaudiosystem.cpp @@ -248,6 +248,19 @@ QT_BEGIN_NAMESPACE */ /*! + \fn virtual void QAbstractAudioOutput::setVolume(qreal volume) + Sets the volume. + Where \a volume is between 0.0 and 1.0. + \since 5.0 +*/ + +/*! + \fn virtual qreal QAbstractAudioOutput::volume() const + Returns the volume in the range 0.0 and 1.0. + \since 5.0 +*/ + +/*! \fn QAbstractAudioOutput::errorChanged(QAudio::Error error) This signal is emitted when the \a error state has changed. \since 1.0 diff --git a/src/multimediakit/audio/qaudiosystem.h b/src/multimediakit/audio/qaudiosystem.h index 7430528..72dbffa 100644 --- a/src/multimediakit/audio/qaudiosystem.h +++ b/src/multimediakit/audio/qaudiosystem.h @@ -95,6 +95,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; } Q_SIGNALS: void errorChanged(QAudio::Error); diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index 927cbc7..b638d07 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -41,6 +41,7 @@ #include <QtCore/qcoreapplication.h> #include <QtCore/qdebug.h> +#include <QtCore/qmath.h> #include "qaudiooutput_pulse.h" #include "qaudiodeviceinfo_pulse.h" @@ -150,6 +151,7 @@ QPulseAudioOutput::QPulseAudioOutput(const QByteArray &device) , m_tickTimer(new QTimer(this)) , m_audioBuffer(0) , m_resuming(false) + , m_volume(1.0) { connect(m_tickTimer, SIGNAL(timeout()), SLOT(userFeed())); } @@ -247,6 +249,7 @@ bool QPulseAudioOutput::open() return false; } + m_spec = spec; m_totalTimeValue = 0; m_elapsedTimeOffset = 0; m_timeStamp.restart(); @@ -272,7 +275,16 @@ bool QPulseAudioOutput::open() pa_stream_set_overflow_callback(m_stream, outputStreamOverflowCallback, this); pa_stream_set_latency_update_callback(m_stream, outputStreamLatencyCallback, this); - if (pa_stream_connect_playback(m_stream, m_device.data(), NULL, (pa_stream_flags_t)0, NULL, NULL) < 0) { + pa_volume_t paVolume; + if (qFuzzyCompare(m_volume, 0.0)) { + paVolume = PA_VOLUME_MUTED; + m_volume = 0.0; + } else { + paVolume = qFloor(m_volume * PA_VOLUME_NORM + 0.5); + } + pa_cvolume_set(&m_chVolume, m_spec.channels, paVolume); + + if (pa_stream_connect_playback(m_stream, m_device.data(), NULL, (pa_stream_flags_t)0, &m_chVolume, NULL) < 0) { qWarning() << "pa_stream_connect_playback() failed!"; return false; } @@ -568,6 +580,42 @@ qint64 OutputPrivate::writeData(const char *data, qint64 len) return written; } +void QPulseAudioOutput::setVolume(qreal vol) +{ + if (vol >= 0.0 && vol <= 1.0) { + if (!qFuzzyCompare(m_volume, vol)) { + m_volume = vol; + if (m_opened) { + QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance(); + pa_threaded_mainloop_lock(pulseEngine->mainloop()); + pa_volume_t paVolume; + if (qFuzzyCompare(vol, 0.0)) { + pa_cvolume_mute(&m_chVolume, m_spec.channels); + m_volume = 0.0; + } else { + paVolume = qFloor(m_volume * PA_VOLUME_NORM + 0.5); + pa_cvolume_set(&m_chVolume, m_spec.channels, paVolume); + } + pa_operation *op = pa_context_set_sink_input_volume(pulseEngine->context(), + pa_stream_get_index(m_stream), + &m_chVolume, + NULL, + NULL); + if (op == NULL) + qWarning()<<"QAudioOutput: Failed to set volume"; + else + pa_operation_unref(op); + pa_threaded_mainloop_unlock(pulseEngine->mainloop()); + } + } + } +} + +qreal QPulseAudioOutput::volume() const +{ + return m_volume; +} + QT_END_NAMESPACE #include "moc_qaudiooutput_pulse.cpp" diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.h b/src/plugins/pulseaudio/qaudiooutput_pulse.h index f6f6282..884164e 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.h +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.h @@ -95,6 +95,9 @@ public: void setFormat(const QAudioFormat &format); QAudioFormat format() const; + void setVolume(qreal volume); + qreal volume() const; + public: void streamUnderflowCallback(); @@ -129,6 +132,10 @@ private: QTime m_timeStamp; qint64 m_elapsedTimeOffset; bool m_resuming; + + qreal m_volume; + pa_cvolume m_chVolume; + pa_sample_spec m_spec; }; class OutputPrivate : public QIODevice |