summaryrefslogtreecommitdiffstats
path: root/src/multimedia/audio/qaudiooutput_alsa_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/audio/qaudiooutput_alsa_p.cpp')
-rw-r--r--src/multimedia/audio/qaudiooutput_alsa_p.cpp35
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;