summaryrefslogtreecommitdiffstats
path: root/src/multimedia/audio/qaudiohelpers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/audio/qaudiohelpers.cpp')
-rw-r--r--src/multimedia/audio/qaudiohelpers.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/multimedia/audio/qaudiohelpers.cpp b/src/multimedia/audio/qaudiohelpers.cpp
new file mode 100644
index 000000000..994950701
--- /dev/null
+++ b/src/multimedia/audio/qaudiohelpers.cpp
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaudiohelpers_p.h"
+
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+namespace QAudioHelperInternal
+{
+
+template<class T> void adjustSamples(qreal factor, const void *src, void *dst, int samples)
+{
+ const T *pSrc = (const T *)src;
+ T *pDst = (T*)dst;
+ for ( int i = 0; i < samples; i++ )
+ pDst[i] = pSrc[i] * factor;
+}
+
+// Unsigned samples are biased around 0x80/0x8000 :/
+// This makes a pure template solution a bit unwieldy but possible
+template<class T> struct signedVersion {};
+template<> struct signedVersion<quint8>
+{
+ typedef qint8 TS;
+ enum {offset = 0x80};
+};
+
+template<> struct signedVersion<quint16>
+{
+ typedef qint16 TS;
+ enum {offset = 0x8000};
+};
+
+template<> struct signedVersion<quint32>
+{
+ typedef qint32 TS;
+ enum {offset = 0x80000000};
+};
+
+template<class T> void adjustUnsignedSamples(qreal factor, const void *src, void *dst, int samples)
+{
+ const T *pSrc = (const T *)src;
+ T *pDst = (T*)dst;
+ for ( int i = 0; i < samples; i++ ) {
+ pDst[i] = signedVersion<T>::offset + ((typename signedVersion<T>::TS)(pSrc[i] - signedVersion<T>::offset) * factor);
+ }
+}
+
+void qMultiplySamples(qreal factor, const QAudioFormat &format, const void* src, void* dest, int len)
+{
+ int samplesCount = len / (format.sampleSize()/8);
+
+ switch ( format.sampleSize() ) {
+ case 8:
+ if (format.sampleType() == QAudioFormat::SignedInt)
+ QAudioHelperInternal::adjustSamples<qint8>(factor,src,dest,samplesCount);
+ else if (format.sampleType() == QAudioFormat::UnSignedInt)
+ QAudioHelperInternal::adjustUnsignedSamples<quint8>(factor,src,dest,samplesCount);
+ break;
+ case 16:
+ if (format.sampleType() == QAudioFormat::SignedInt)
+ QAudioHelperInternal::adjustSamples<qint16>(factor,src,dest,samplesCount);
+ else if (format.sampleType() == QAudioFormat::UnSignedInt)
+ QAudioHelperInternal::adjustUnsignedSamples<quint16>(factor,src,dest,samplesCount);
+ break;
+ default:
+ if (format.sampleType() == QAudioFormat::SignedInt)
+ QAudioHelperInternal::adjustSamples<qint32>(factor,src,dest,samplesCount);
+ else if (format.sampleType() == QAudioFormat::UnSignedInt)
+ QAudioHelperInternal::adjustUnsignedSamples<quint32>(factor,src,dest,samplesCount);
+ else if (format.sampleType() == QAudioFormat::Float)
+ QAudioHelperInternal::adjustSamples<float>(factor,src,dest,samplesCount);
+ }
+}
+}
+
+QT_END_NAMESPACE