summaryrefslogtreecommitdiff
path: root/src/audio/AudioBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/AudioBuffer.cpp')
-rw-r--r--src/audio/AudioBuffer.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/audio/AudioBuffer.cpp b/src/audio/AudioBuffer.cpp
new file mode 100644
index 0000000..64032c3
--- /dev/null
+++ b/src/audio/AudioBuffer.cpp
@@ -0,0 +1,105 @@
+//
+// libavg - Media Playback Engine.
+// Copyright (C) 2003-2014 Ulrich von Zadow
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// Current versions can be found at www.libavg.de
+//
+// Original author of this file is Nick Hebner (hebnern@gmail.com).
+//
+
+#include "AudioBuffer.h"
+
+#include <string>
+#include <cstring>
+
+#define VOLUME_FADE_SAMPLES 100
+
+namespace avg {
+
+AudioBuffer::AudioBuffer(int numFrames, AudioParams ap)
+ : m_NumFrames(numFrames),
+ m_AP(ap)
+{
+ m_pData = new short[numFrames*sizeof(short)*ap.m_Channels];
+}
+
+AudioBuffer::~AudioBuffer()
+{
+ delete[] m_pData;
+}
+
+short* AudioBuffer::getData()
+{
+ return m_pData;
+}
+
+int AudioBuffer::getNumFrames()
+{
+ return m_NumFrames;
+}
+
+int AudioBuffer::getNumBytes()
+{
+ return m_NumFrames*m_AP.m_Channels*sizeof(short);
+}
+
+int AudioBuffer::getFrameSize()
+{
+ return m_AP.m_Channels*sizeof(short);
+}
+
+int AudioBuffer::getNumChannels()
+{
+ return m_AP.m_Channels;
+}
+
+int AudioBuffer::getRate()
+{
+ return m_AP.m_SampleRate;
+}
+
+void AudioBuffer::clear()
+{
+ memset(m_pData, 0, m_NumFrames*sizeof(short)*m_AP.m_Channels);
+}
+
+void AudioBuffer::volumize(float lastVol, float curVol)
+{
+ float volDiff = lastVol - curVol;
+
+ if (curVol == 1.0f && volDiff == 0.0f) {
+ return;
+ }
+
+ for (int i = 0; i < m_NumFrames*m_AP.m_Channels; i++) {
+ float fadeVol = 0;
+ if (volDiff != 0 && i < VOLUME_FADE_SAMPLES) {
+ fadeVol = volDiff * (VOLUME_FADE_SAMPLES - i) / VOLUME_FADE_SAMPLES;
+ }
+
+ int s = int(m_pData[i] * (curVol + fadeVol));
+
+ if (s < -32768)
+ s = -32768;
+ if (s > 32767)
+ s = 32767;
+
+ m_pData[i] = s;
+ }
+}
+
+}