summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-08-18 23:19:22 +0100
committerCarl Hetherington <cth@carlh.net>2013-08-18 23:19:22 +0100
commit75518e16a2c35400ac641975c74ff72b404cef69 (patch)
treec9baedfcbc728aacb5d748faa91f1c4ef3c58239 /src
parent88ea433b3fa1c09b94ffc94b48e164a40ede9cfa (diff)
Try to make audio gain work again.
Diffstat (limited to 'src')
-rw-r--r--src/lib/audio_buffers.cc13
-rw-r--r--src/lib/audio_buffers.h2
-rw-r--r--src/lib/player.cc7
3 files changed, 22 insertions, 0 deletions
diff --git a/src/lib/audio_buffers.cc b/src/lib/audio_buffers.cc
index a15288a3b..e80142b8e 100644
--- a/src/lib/audio_buffers.cc
+++ b/src/lib/audio_buffers.cc
@@ -19,6 +19,7 @@
#include <cassert>
#include <cstring>
+#include <cmath>
#include <stdexcept>
#include "audio_buffers.h"
@@ -260,3 +261,15 @@ AudioBuffers::accumulate_frames (AudioBuffers const * from, int read_offset, int
}
}
+/** @param dB gain in dB */
+void
+AudioBuffers::apply_gain (float dB)
+{
+ float const linear = pow (10, dB / 20);
+
+ for (int i = 0; i < _channels; ++i) {
+ for (int j = 0; j < _frames; ++j) {
+ _data[i][j] *= linear;
+ }
+ }
+}
diff --git a/src/lib/audio_buffers.h b/src/lib/audio_buffers.h
index 0950f5d67..75bc686f8 100644
--- a/src/lib/audio_buffers.h
+++ b/src/lib/audio_buffers.h
@@ -57,6 +57,8 @@ public:
void make_silent (int c);
void make_silent (int from, int frames);
+ void apply_gain (float);
+
void copy_from (AudioBuffers const * from, int frames_to_copy, int read_offset, int write_offset);
void move (int from, int to, int frames);
void accumulate_channel (AudioBuffers const *, int, int);
diff --git a/src/lib/player.cc b/src/lib/player.cc
index f8ccb0142..ebc810214 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -300,6 +300,13 @@ Player::process_audio (weak_ptr<Piece> weak_piece, shared_ptr<const AudioBuffers
shared_ptr<AudioContent> content = dynamic_pointer_cast<AudioContent> (piece->content);
assert (content);
+ /* Gain */
+ if (content->audio_gain() != 0) {
+ shared_ptr<AudioBuffers> gain (new AudioBuffers (audio));
+ gain->apply_gain (content->audio_gain ());
+ audio = gain;
+ }
+
/* Resample */
if (content->content_audio_frame_rate() != content->output_audio_frame_rate()) {
shared_ptr<Resampler> r = resampler (content, true);