summaryrefslogtreecommitdiff
path: root/src/lib/upmixer_a.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-07-15 13:15:02 +0100
committerCarl Hetherington <cth@carlh.net>2014-07-15 13:15:02 +0100
commit7f38d676e69639a7825e506618613051651968cf (patch)
treefcbdaf6d1536c58bfffe739d26c7c9bf676f8695 /src/lib/upmixer_a.cc
parente5f79c57e1123754b1325f964123fcb56a2572b3 (diff)
Add simple stereo-5.1 upmixer.
Diffstat (limited to 'src/lib/upmixer_a.cc')
-rw-r--r--src/lib/upmixer_a.cc109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/lib/upmixer_a.cc b/src/lib/upmixer_a.cc
new file mode 100644
index 000000000..dce08fe37
--- /dev/null
+++ b/src/lib/upmixer_a.cc
@@ -0,0 +1,109 @@
+/*
+ Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "upmixer_a.h"
+#include "audio_buffers.h"
+
+#include "i18n.h"
+
+using std::string;
+using boost::shared_ptr;
+
+UpmixerA::UpmixerA (int sampling_rate)
+ : _left (0.02, 1900.0 / sampling_rate, 4800.0 / sampling_rate)
+ , _right (0.02, 1900.0 / sampling_rate, 4800.0 / sampling_rate)
+ , _centre (0.02, 150.0 / sampling_rate, 1900.0 / sampling_rate)
+ , _lfe (0.02, 20.0 / sampling_rate, 150.0 / sampling_rate)
+ , _ls (0.02, 4800.0 / sampling_rate, 20000.0 / sampling_rate)
+ , _rs (0.02, 4800.0 / sampling_rate, 20000.0 / sampling_rate)
+{
+
+}
+
+string
+UpmixerA::name () const
+{
+ return _("Stereo to 5.1 up-mixer A");
+}
+
+
+string
+UpmixerA::id () const
+{
+ return N_("stereo-5.1-upmix-a");
+}
+
+ChannelCount
+UpmixerA::in_channels () const
+{
+ return ChannelCount (2);
+}
+
+int
+UpmixerA::out_channels (int) const
+{
+ return 6;
+}
+
+shared_ptr<AudioProcessor>
+UpmixerA::clone (int sampling_rate) const
+{
+ return shared_ptr<AudioProcessor> (new UpmixerA (sampling_rate));
+}
+
+shared_ptr<AudioBuffers>
+UpmixerA::run (shared_ptr<const AudioBuffers> in)
+{
+ /* Input L and R */
+ shared_ptr<AudioBuffers> in_L = in->channel (0);
+ shared_ptr<AudioBuffers> in_R = in->channel (1);
+
+ /* Mix of L and R */
+ shared_ptr<AudioBuffers> in_LR = in_L->clone ();
+ in_LR->accumulate_frames (in_R.get(), 0, 0, in_R->frames ());
+ in_LR->apply_gain (0.5);
+
+ /* Run filters */
+ shared_ptr<AudioBuffers> L = _left.run (in_L);
+ shared_ptr<AudioBuffers> R = _right.run (in_R);
+ shared_ptr<AudioBuffers> C = _centre.run (in_LR);
+ shared_ptr<AudioBuffers> Lfe = _lfe.run (in_LR);
+ shared_ptr<AudioBuffers> Ls = _ls.run (in_L);
+ shared_ptr<AudioBuffers> Rs = _rs.run (in_R);
+
+ shared_ptr<AudioBuffers> out (new AudioBuffers (6, in->frames ()));
+ out->copy_channel_from (L.get(), 0, 0);
+ out->copy_channel_from (R.get(), 0, 1);
+ out->copy_channel_from (C.get(), 0, 2);
+ out->copy_channel_from (Lfe.get(), 0, 3);
+ out->copy_channel_from (Ls.get(), 0, 4);
+ out->copy_channel_from (Rs.get(), 0, 5);
+ return out;
+}
+
+void
+UpmixerA::flush ()
+{
+ _left.flush ();
+ _right.flush ();
+ _centre.flush ();
+ _lfe.flush ();
+ _ls.flush ();
+ _rs.flush ();
+}