summaryrefslogtreecommitdiffstats
path: root/src/plugins/pulseaudio/qpulsehelpers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/pulseaudio/qpulsehelpers.cpp')
-rw-r--r--src/plugins/pulseaudio/qpulsehelpers.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/plugins/pulseaudio/qpulsehelpers.cpp b/src/plugins/pulseaudio/qpulsehelpers.cpp
new file mode 100644
index 000000000..57e50758f
--- /dev/null
+++ b/src/plugins/pulseaudio/qpulsehelpers.cpp
@@ -0,0 +1,220 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qpulsehelpers.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QPulseAudioInternal
+{
+pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format)
+{
+ pa_sample_spec spec;
+
+ spec.rate = format.frequency();
+ spec.channels = format.channels();
+
+ if (format.sampleSize() == 8) {
+ spec.format = PA_SAMPLE_U8;
+ } else if (format.sampleSize() == 16) {
+ switch (format.byteOrder()) {
+ case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S16BE; break;
+ case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S16LE; break;
+ }
+ } else if (format.sampleSize() == 24) {
+ switch (format.byteOrder()) {
+ case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S24BE; break;
+ case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S24LE; break;
+ }
+ } else if (format.sampleSize() == 32) {
+ switch (format.byteOrder()) {
+ case QAudioFormat::BigEndian:
+ format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32BE : spec.format = PA_SAMPLE_S32BE;
+ break;
+ case QAudioFormat::LittleEndian:
+ format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32LE : spec.format = PA_SAMPLE_S32LE;
+ break;
+ }
+ } else {
+ spec.format = PA_SAMPLE_INVALID;
+ }
+
+ return spec;
+}
+
+#ifdef DEBUG_PULSE
+QString stateToQString(pa_stream_state_t state)
+{
+ switch (state)
+ {
+ case PA_STREAM_UNCONNECTED: return "Unconnected";
+ case PA_STREAM_CREATING: return "Creating";
+ case PA_STREAM_READY: return "Ready";
+ case PA_STREAM_FAILED: return "Failed";
+ case PA_STREAM_TERMINATED: return "Terminated";
+ }
+
+ return QString("Unknown state: %0").arg(state);
+}
+
+QString sampleFormatToQString(pa_sample_format format)
+{
+ switch (format)
+ {
+ case PA_SAMPLE_U8: return "Unsigned 8 Bit PCM.";
+ case PA_SAMPLE_ALAW: return "8 Bit a-Law ";
+ case PA_SAMPLE_ULAW: return "8 Bit mu-Law";
+ case PA_SAMPLE_S16LE: return "Signed 16 Bit PCM, little endian (PC).";
+ case PA_SAMPLE_S16BE: return "Signed 16 Bit PCM, big endian.";
+ case PA_SAMPLE_FLOAT32LE: return "32 Bit IEEE floating point, little endian (PC), range -1.0 to 1.0";
+ case PA_SAMPLE_FLOAT32BE: return "32 Bit IEEE floating point, big endian, range -1.0 to 1.0";
+ case PA_SAMPLE_S32LE: return "Signed 32 Bit PCM, little endian (PC).";
+ case PA_SAMPLE_S32BE: return "Signed 32 Bit PCM, big endian.";
+ case PA_SAMPLE_S24LE: return "Signed 24 Bit PCM packed, little endian (PC).";
+ case PA_SAMPLE_S24BE: return "Signed 24 Bit PCM packed, big endian.";
+ case PA_SAMPLE_S24_32LE: return "Signed 24 Bit PCM in LSB of 32 Bit words, little endian (PC).";
+ case PA_SAMPLE_S24_32BE: return "Signed 24 Bit PCM in LSB of 32 Bit words, big endian.";
+ case PA_SAMPLE_MAX: return "Upper limit of valid sample types.";
+ case PA_SAMPLE_INVALID: return "Invalid sample format";
+ }
+
+ return QString("Invalid value: %0").arg(format);
+}
+
+QString stateToQString(pa_context_state_t state)
+{
+ switch (state)
+ {
+ case PA_CONTEXT_UNCONNECTED: return "Unconnected";
+ case PA_CONTEXT_CONNECTING: return "Connecting";
+ case PA_CONTEXT_AUTHORIZING: return "Authorizing";
+ case PA_CONTEXT_SETTING_NAME: return "Setting Name";
+ case PA_CONTEXT_READY: return "Ready";
+ case PA_CONTEXT_FAILED: return "Failed";
+ case PA_CONTEXT_TERMINATED: return "Terminated";
+ }
+
+ return QString("Unknown state: %0").arg(state);
+}
+#endif
+
+QAudioFormat sampleSpecToAudioFormat(pa_sample_spec spec)
+{
+ QAudioFormat format;
+ format.setFrequency(spec.rate);
+ format.setChannelCount(spec.channels);
+ format.setCodec("audio/pcm");
+
+ switch (spec.format) {
+ case PA_SAMPLE_U8:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::UnSignedInt);
+ format.setSampleSize(8);
+ break;
+ case PA_SAMPLE_ALAW:
+ // TODO:
+ break;
+ case PA_SAMPLE_ULAW:
+ // TODO:
+ break;
+ case PA_SAMPLE_S16LE:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(16);
+ break;
+ case PA_SAMPLE_S16BE:
+ format.setByteOrder(QAudioFormat::BigEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(16);
+ break;
+ case PA_SAMPLE_FLOAT32LE:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::Float);
+ format.setSampleSize(32);
+ break;
+ case PA_SAMPLE_FLOAT32BE:
+ format.setByteOrder(QAudioFormat::BigEndian);
+ format.setSampleType(QAudioFormat::Float);
+ format.setSampleSize(32);
+ break;
+ case PA_SAMPLE_S32LE:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(32);
+ break;
+ case PA_SAMPLE_S32BE:
+ format.setByteOrder(QAudioFormat::BigEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(32);
+ break;
+ case PA_SAMPLE_S24LE:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(24);
+ break;
+ case PA_SAMPLE_S24BE:
+ format.setByteOrder(QAudioFormat::BigEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(24);
+ break;
+ case PA_SAMPLE_S24_32LE:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(24);
+ break;
+ case PA_SAMPLE_S24_32BE:
+ format.setByteOrder(QAudioFormat::BigEndian);
+ format.setSampleType(QAudioFormat::SignedInt);
+ format.setSampleSize(24);
+ break;
+ case PA_SAMPLE_MAX:
+ case PA_SAMPLE_INVALID:
+ default:
+ format.setByteOrder(QAudioFormat::LittleEndian);
+ format.setSampleType(QAudioFormat::Unknown);
+ format.setSampleSize(0);
+ }
+
+ return format;
+}
+}
+
+QT_END_NAMESPACE