diff options
Diffstat (limited to 'src/multimedia/audio/qaudiooutput_alsa_p.cpp')
-rw-r--r-- | src/multimedia/audio/qaudiooutput_alsa_p.cpp | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/src/multimedia/audio/qaudiooutput_alsa_p.cpp b/src/multimedia/audio/qaudiooutput_alsa_p.cpp index 8da76d958..e80cf1503 100644 --- a/src/multimedia/audio/qaudiooutput_alsa_p.cpp +++ b/src/multimedia/audio/qaudiooutput_alsa_p.cpp @@ -53,6 +53,7 @@ #include <QtCore/qcoreapplication.h> #include "qaudiooutput_alsa_p.h" #include "qaudiodeviceinfo_alsa_p.h" +#include "qaudiohelpers_p.h" QT_BEGIN_NAMESPACE @@ -81,6 +82,8 @@ QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device) resuming = false; opened = false; + m_volume = 1.0f; + m_device = device; timer = new QTimer(this); @@ -95,6 +98,16 @@ QAudioOutputPrivate::~QAudioOutputPrivate() delete timer; } +void QAudioOutputPrivate::setVolume(qreal vol) +{ + m_volume = vol; +} + +qreal QAudioOutputPrivate::volume() const +{ + return m_volume; +} + QAudio::Error QAudioOutputPrivate::error() const { return errorState; @@ -571,15 +584,23 @@ qint64 QAudioOutputPrivate::write( const char *data, qint64 len ) #endif int frames, err; int space = bytesFree(); - if(len < space) { - // Just write it - frames = snd_pcm_bytes_to_frames( handle, (int)len ); - err = snd_pcm_writei( handle, data, frames ); + + if (!space) + return 0; + + if (len < space) + space = len; + + frames = snd_pcm_bytes_to_frames(handle, space); + + if (m_volume < 1.0f) { + char out[space]; + QAudioHelperInternal::qMultiplySamples(m_volume, settings, data, out, space); + err = snd_pcm_writei(handle, out, frames); } else { - // Only write space worth - frames = snd_pcm_bytes_to_frames( handle, (int)space ); - err = snd_pcm_writei( handle, data, frames ); + err = snd_pcm_writei(handle, data, frames); } + if(err > 0) { totalTimeValue += err; resuming = false; |