summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames McDonnell <jmcdonnell@blackberry.com>2017-03-24 11:31:56 -0400
committerJames McDonnell <jmcdonnell@blackberry.com>2017-03-27 16:33:31 +0000
commit1221f6a7e3767e14d2afdfc806120953bd6535be (patch)
tree2667f6a27d99818167323fbd3ac2458bcf761452
parent7d51214b609df7e5ec79b56f0c629e084cb886bc (diff)
Propagate audio category into the QNX audio output object
For QNX 7.0.0, set the QNX stream type to the audio category. 6.6.0 doesn't support stream types. Add a -category command line argument to the spectrum example so that the audio category can be specified. Change-Id: I6a81210ce07dc4bd2f6cf81983c2f3e4c480ef0d Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
-rw-r--r--examples/multimedia/spectrum/app/engine.cpp19
-rw-r--r--examples/multimedia/spectrum/app/engine.h1
-rw-r--r--src/plugins/qnx-audio/audio/qnxaudiooutput.cpp39
-rw-r--r--src/plugins/qnx-audio/audio/qnxaudiooutput.h6
4 files changed, 65 insertions, 0 deletions
diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp
index 3a01fa7a7..eae4c8e74 100644
--- a/examples/multimedia/spectrum/app/engine.cpp
+++ b/examples/multimedia/spectrum/app/engine.cpp
@@ -103,6 +103,23 @@ Engine::Engine(QObject *parent)
this,
SLOT(spectrumChanged(FrequencySpectrum)));
+ // This code might misinterpret things like "-something -category". But
+ // it's unlikely that that needs to be supported so we'll let it go.
+ QStringList arguments = QCoreApplication::instance()->arguments();
+ for (int i = 0; i < arguments.count(); ++i) {
+ if (arguments.at(i) == QStringLiteral("--"))
+ break;
+
+ if (arguments.at(i) == QStringLiteral("-category")
+ || arguments.at(i) == QStringLiteral("--category")) {
+ ++i;
+ if (i < arguments.count())
+ m_audioOutputCategory = arguments.at(i);
+ else
+ --i;
+ }
+ }
+
initialize();
#ifdef DUMP_DATA
@@ -494,6 +511,7 @@ bool Engine::initialize()
}
m_audioOutput = new QAudioOutput(m_audioOutputDevice, m_format, this);
m_audioOutput->setNotifyInterval(NotifyIntervalMs);
+ m_audioOutput->setCategory(m_audioOutputCategory);
}
} else {
if (m_file)
@@ -508,6 +526,7 @@ bool Engine::initialize()
ENGINE_DEBUG << "Engine::initialize" << "m_bufferLength" << m_bufferLength;
ENGINE_DEBUG << "Engine::initialize" << "m_dataLength" << m_dataLength;
ENGINE_DEBUG << "Engine::initialize" << "format" << m_format;
+ ENGINE_DEBUG << "Engine::initialize" << "m_audioOutputCategory" << m_audioOutputCategory;
return result;
}
diff --git a/examples/multimedia/spectrum/app/engine.h b/examples/multimedia/spectrum/app/engine.h
index db76d7b42..af08b83cc 100644
--- a/examples/multimedia/spectrum/app/engine.h
+++ b/examples/multimedia/spectrum/app/engine.h
@@ -287,6 +287,7 @@ private:
const QList<QAudioDeviceInfo> m_availableAudioOutputDevices;
QAudioDeviceInfo m_audioOutputDevice;
QAudioOutput* m_audioOutput;
+ QString m_audioOutputCategory;
qint64 m_playPosition;
QBuffer m_audioOutputIODevice;
diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp
index d08d01e6d..084c5b371 100644
--- a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp
+++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp
@@ -214,6 +214,16 @@ qreal QnxAudioOutput::volume() const
return m_volume;
}
+void QnxAudioOutput::setCategory(const QString &category)
+{
+ m_category = category;
+}
+
+QString QnxAudioOutput::category() const
+{
+ return m_category;
+}
+
void QnxAudioOutput::pullData()
{
if (m_state == QAudio::StoppedState || m_state == QAudio::SuspendedState)
@@ -303,6 +313,7 @@ bool QnxAudioOutput::open()
}
snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudio::AudioOutput, info.max_fragment_size);
+ setTypeName(&params);
if ((errorCode = snd_pcm_plugin_params(m_pcmHandle, &params)) < 0) {
qWarning("QnxAudioOutput: open error, couldn't set channel params (0x%x)", -errorCode);
@@ -400,6 +411,34 @@ qint64 QnxAudioOutput::write(const char *data, qint64 len)
}
}
+#if _NTO_VERSION >= 700
+
+void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *params)
+{
+ if (m_category.isEmpty())
+ return;
+
+ QByteArray latin1Category = m_category.toLatin1();
+
+ if (QString::fromLatin1(latin1Category) != m_category) {
+ qWarning("QnxAudioOutput: audio category name isn't a Latin1 string.");
+ return;
+ }
+
+ if (latin1Category.size() >= static_cast<int>(sizeof(params->audio_type_name))) {
+ qWarning("QnxAudioOutput: audio category name too long.");
+ return;
+ }
+
+ strcpy(params->audio_type_name, latin1Category.constData());
+}
+
+#else
+
+void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *) {}
+
+#endif
+
QnxPushIODevice::QnxPushIODevice(QnxAudioOutput *output)
: QIODevice(output),
m_output(output)
diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.h b/src/plugins/qnx-audio/audio/qnxaudiooutput.h
index 5ee69b542..c4fe37516 100644
--- a/src/plugins/qnx-audio/audio/qnxaudiooutput.h
+++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.h
@@ -47,6 +47,7 @@
#include <QIODevice>
#include <sys/asoundlib.h>
+#include <sys/neutrino.h>
QT_BEGIN_NAMESPACE
@@ -80,6 +81,8 @@ public:
QAudioFormat format() const Q_DECL_OVERRIDE;
void setVolume(qreal volume) Q_DECL_OVERRIDE;
qreal volume() const Q_DECL_OVERRIDE;
+ void setCategory(const QString &category) Q_DECL_OVERRIDE;
+ QString category() const Q_DECL_OVERRIDE;
private slots:
void pullData();
@@ -90,6 +93,8 @@ private:
void setError(QAudio::Error error);
void setState(QAudio::State state);
+ void setTypeName(snd_pcm_channel_params_t *params);
+
friend class QnxPushIODevice;
qint64 write(const char *data, qint64 len);
@@ -102,6 +107,7 @@ private:
QAudio::State m_state;
QAudioFormat m_format;
qreal m_volume;
+ QString m_category;
int m_periodSize;
snd_pcm_t *m_pcmHandle;