summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/multimedia/spectrum/app/engine.cpp12
-rw-r--r--examples/multimedia/spectrum/app/engine.h1
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp35
-rw-r--r--src/multimedia/audio/qaudiooutput.h4
-rw-r--r--src/multimedia/audio/qaudiosystem.cpp5
-rw-r--r--src/multimedia/audio/qaudiosystem_p.h6
-rw-r--r--src/multimedia/platform/android/audio/qopenslesaudiooutput.cpp56
-rw-r--r--src/multimedia/platform/android/audio/qopenslesaudiooutput_p.h5
-rw-r--r--src/multimedia/platform/darwin/audio/qcoreaudiooutput.mm10
-rw-r--r--src/multimedia/platform/darwin/audio/qcoreaudiooutput_p.h3
-rw-r--r--src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer.cpp12
-rw-r--r--src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer_p.h3
-rw-r--r--src/multimedia/platform/pulseaudio/qaudiooutput_pulse.cpp35
-rw-r--r--src/multimedia/platform/pulseaudio/qaudiooutput_pulse_p.h4
-rw-r--r--src/multimedia/platform/qnx/audio/qnxaudiooutput.cpp13
-rw-r--r--src/multimedia/platform/qnx/audio/qnxaudiooutput_p.h3
16 files changed, 73 insertions, 134 deletions
diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp
index 8d688ca0d..c251414af 100644
--- a/examples/multimedia/spectrum/app/engine.cpp
+++ b/examples/multimedia/spectrum/app/engine.cpp
@@ -68,7 +68,6 @@
//-----------------------------------------------------------------------------
const qint64 BufferDurationUs = 10 * 1000000;
-const int NotifyIntervalMs = 100;
// Size of the level calculation window in microseconds
const int LevelWindowUs = 0.1 * 1000000;
@@ -113,15 +112,6 @@ Engine::Engine(QObject *parent)
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();
@@ -523,7 +513,6 @@ bool Engine::initialize()
}
}
m_audioOutput = new QAudioOutput(m_audioOutputDevice, m_format, this);
- m_audioOutput->setCategory(m_audioOutputCategory);
}
} else {
if (m_file)
@@ -538,7 +527,6 @@ 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 a6aada174..97c2c7f41 100644
--- a/examples/multimedia/spectrum/app/engine.h
+++ b/examples/multimedia/spectrum/app/engine.h
@@ -300,7 +300,6 @@ 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/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
index 0d404cb81..2d3639904 100644
--- a/src/multimedia/audio/qaudiooutput.cpp
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -346,38 +346,23 @@ qreal QAudioOutput::volume() const
}
/*!
- Returns the audio category of this audio stream.
+ \property QMediaPlayer::audioRole
+ \brief the role of the audio stream played by the media player.
- Some platforms can group audio streams into categories
- and manage their volumes independently, or display them
- in a system mixer control. You can set this property to
- allow the platform to distinguish the purpose of your streams.
+ It can be set to specify the type of audio being played, allowing the system to make
+ appropriate decisions when it comes to volume, routing or post-processing.
- \sa setCategory()
+ The audio role must be set before calling setMedia().
*/
-QString QAudioOutput::category() const
+
+QAudio::Role QAudioOutput::audioRole() const
{
- return d->category();
+ return d->role();
}
-/*!
- Sets the audio category of this audio stream to \a category.
-
- Some platforms can group audio streams into categories
- and manage their volumes independently, or display them
- in a system mixer control. You can set this property to
- allow the platform to distinguish the purpose of your streams.
-
- Not all platforms support audio stream categorization. In this
- case, the function call will be ignored.
-
- Changing an audio output stream's category while it is opened
- will not take effect until it is reopened.
- \sa category()
-*/
-void QAudioOutput::setCategory(const QString &category)
+void QAudioOutput::setAudioRole(QAudio::Role role)
{
- d->setCategory(category);
+ d->setRole(role);
}
/*!
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
index 342f7f800..e5d47c7bf 100644
--- a/src/multimedia/audio/qaudiooutput.h
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -92,8 +92,8 @@ public:
void setVolume(qreal);
qreal volume() const;
- QString category() const;
- void setCategory(const QString &category);
+ QAudio::Role audioRole() const;
+ void setAudioRole(QAudio::Role role);
Q_SIGNALS:
void stateChanged(QAudio::State state);
diff --git a/src/multimedia/audio/qaudiosystem.cpp b/src/multimedia/audio/qaudiosystem.cpp
index 9aa8d5114..f9c5e41f0 100644
--- a/src/multimedia/audio/qaudiosystem.cpp
+++ b/src/multimedia/audio/qaudiosystem.cpp
@@ -216,6 +216,11 @@ int QAbstractAudioOutput::periodSize() const
Returns the volume in the range 0.0 and 1.0.
*/
+void QAbstractAudioOutput::setRole(QAudio::Role role)
+{
+ m_role = role;
+}
+
/*!
\fn QAbstractAudioOutput::errorChanged(QAudio::Error error)
This signal is emitted when the \a error state has changed.
diff --git a/src/multimedia/audio/qaudiosystem_p.h b/src/multimedia/audio/qaudiosystem_p.h
index fb0ad3e12..7f77484a6 100644
--- a/src/multimedia/audio/qaudiosystem_p.h
+++ b/src/multimedia/audio/qaudiosystem_p.h
@@ -85,14 +85,16 @@ public:
virtual QAudioFormat format() const = 0;
virtual void setVolume(qreal) {}
virtual qreal volume() const { return 1.0; }
- virtual QString category() const { return QString(); }
- virtual void setCategory(const QString &) { }
+ QAudio::Role role() const { return m_role; }
+ virtual void setRole(QAudio::Role role);
QElapsedTimer elapsedTime;
Q_SIGNALS:
void errorChanged(QAudio::Error error);
void stateChanged(QAudio::State state);
+protected:
+ QAudio::Role m_role = QAudio::UnknownRole;
};
class QAbstractAudioInput : public QObject
diff --git a/src/multimedia/platform/android/audio/qopenslesaudiooutput.cpp b/src/multimedia/platform/android/audio/qopenslesaudiooutput.cpp
index 0951da8c6..34b3d7aba 100644
--- a/src/multimedia/platform/android/audio/qopenslesaudiooutput.cpp
+++ b/src/multimedia/platform/android/audio/qopenslesaudiooutput.cpp
@@ -92,7 +92,6 @@ QOpenSLESAudioOutput::QOpenSLESAudioOutput(const QByteArray &device)
m_streamType = -1;
#else
m_streamType = SL_ANDROID_STREAM_MEDIA;
- m_category = QLatin1String("media");
#endif // ANDROID
}
@@ -279,39 +278,44 @@ qreal QOpenSLESAudioOutput::volume() const
return m_volume;
}
-void QOpenSLESAudioOutput::setCategory(const QString &category)
+void QOpenSLESAudioOutput::setCategory(QAudio::Role role)
{
-#ifndef ANDROID
- Q_UNUSED(category);
-#else
- if (m_categories.isEmpty()) {
- m_categories.insert(QLatin1String("voice"), SL_ANDROID_STREAM_VOICE);
- m_categories.insert(QLatin1String("system"), SL_ANDROID_STREAM_SYSTEM);
- m_categories.insert(QLatin1String("ring"), SL_ANDROID_STREAM_RING);
- m_categories.insert(QLatin1String("media"), SL_ANDROID_STREAM_MEDIA);
- m_categories.insert(QLatin1String("alarm"), SL_ANDROID_STREAM_ALARM);
- m_categories.insert(QLatin1String("notification"), SL_ANDROID_STREAM_NOTIFICATION);
- }
-
- const SLint32 streamType = m_categories.value(category, -1);
- if (streamType == -1) {
- qWarning() << "Unknown category" << category
- << ", available categories are:" << m_categories.keys()
- << ". Defaulting to category \"media\"";
- return;
+ QAbstractAudioOutput::setRole(role);
+#ifdef ANDROID
+ switch (role) {
+ case MusicRole:
+ Q_FALLTHROUGH();
+ case VideoRole:
+ m_streamType = SL_ANDROID_STREAM_MEDIA;
+ break;
+ case VoiceCommunicationRole:
+ streamType = SL_ANDROID_STREAM_VOICE;
+ case NotificationRole:
+ m_streamType = SL_ANDROID_STREAM_NOTIFICATION;
+ break;
+ case AlarmRole:
+ m_streamType = SL_ANDROID_STREAM_ALARM;
+ break;
+ case RingtoneRole:
+ m_streamType = SL_ANDROID_STREAM_RING;
+ break;
+ case AccessibilityRole:
+#define STREAM_ACCESSIBILITY 0xa // AudioManager.STREAM_ACCESSIBILITY
+ m_streamType = STREAM_ACCESSIBILITY
+ case SonificationRole:
+ Q_FALLTHROUGH();
+ case GameRole:
+ Q_FALLTHROUGH();
+ case UnknownRole:
+ m_streamType = -1;
+ break;
}
m_startRequiresInit = true;
- m_streamType = streamType;
m_category = category;
#endif // ANDROID
}
-QString QOpenSLESAudioOutput::category() const
-{
- return m_category;
-}
-
void QOpenSLESAudioOutput::onEOSEvent()
{
if (m_state != QAudio::ActiveState)
diff --git a/src/multimedia/platform/android/audio/qopenslesaudiooutput_p.h b/src/multimedia/platform/android/audio/qopenslesaudiooutput_p.h
index 846313d6f..f813d7ae8 100644
--- a/src/multimedia/platform/android/audio/qopenslesaudiooutput_p.h
+++ b/src/multimedia/platform/android/audio/qopenslesaudiooutput_p.h
@@ -87,8 +87,7 @@ public:
void setVolume(qreal volume) override;
qreal volume() const override;
- void setCategory(const QString &category) override;
- QString category() const override;
+ void setRole(QAudio::Role role) override;
private:
friend class SLIODevicePrivate;
@@ -134,8 +133,6 @@ private:
qint32 m_streamType;
QAudioFormat m_format;
- QString m_category;
- static QMap<QString, qint32> m_categories;
};
class SLIODevicePrivate : public QIODevice
diff --git a/src/multimedia/platform/darwin/audio/qcoreaudiooutput.mm b/src/multimedia/platform/darwin/audio/qcoreaudiooutput.mm
index 6d9658277..be11b33dd 100644
--- a/src/multimedia/platform/darwin/audio/qcoreaudiooutput.mm
+++ b/src/multimedia/platform/darwin/audio/qcoreaudiooutput.mm
@@ -428,16 +428,6 @@ qreal QCoreAudioOutput::volume() const
return m_cachedVolume;
}
-void QCoreAudioOutput::setCategory(const QString &category)
-{
- Q_UNUSED(category);
-}
-
-QString QCoreAudioOutput::category() const
-{
- return QString();
-}
-
void QCoreAudioOutput::deviceStopped()
{
emit stateChanged(m_stateCode);
diff --git a/src/multimedia/platform/darwin/audio/qcoreaudiooutput_p.h b/src/multimedia/platform/darwin/audio/qcoreaudiooutput_p.h
index 19e668fd9..1639de47a 100644
--- a/src/multimedia/platform/darwin/audio/qcoreaudiooutput_p.h
+++ b/src/multimedia/platform/darwin/audio/qcoreaudiooutput_p.h
@@ -147,9 +147,6 @@ public:
void setVolume(qreal volume);
qreal volume() const;
- void setCategory(const QString &category);
- QString category() const;
-
private slots:
void deviceStopped();
void inputReady();
diff --git a/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer.cpp b/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer.cpp
index 5e203d08b..2c1d63912 100644
--- a/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer.cpp
+++ b/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer.cpp
@@ -377,18 +377,6 @@ qreal QGStreamerAudioOutput::volume() const
return m_volume;
}
-void QGStreamerAudioOutput::setCategory(const QString &category)
-{
- if (m_category != category) {
- m_category = category;
- }
-}
-
-QString QGStreamerAudioOutput::category() const
-{
- return m_category;
-}
-
void QGStreamerAudioOutput::bytesProcessedByAppSrc(int bytes)
{
m_bytesProcessed += bytes;
diff --git a/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer_p.h b/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer_p.h
index bf4178a02..671a3d37f 100644
--- a/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer_p.h
+++ b/src/multimedia/platform/gstreamer/audio/qaudiooutput_gstreamer_p.h
@@ -100,9 +100,6 @@ public:
void setVolume(qreal volume) override;
qreal volume() const override;
- void setCategory(const QString &category) override;
- QString category() const override;
-
private Q_SLOTS:
void bytesProcessedByAppSrc(int bytes);
void needData();
diff --git a/src/multimedia/platform/pulseaudio/qaudiooutput_pulse.cpp b/src/multimedia/platform/pulseaudio/qaudiooutput_pulse.cpp
index ebfea9c77..95442c272 100644
--- a/src/multimedia/platform/pulseaudio/qaudiooutput_pulse.cpp
+++ b/src/multimedia/platform/pulseaudio/qaudiooutput_pulse.cpp
@@ -305,9 +305,23 @@ bool QPulseAudioOutput::open()
qint64 bytesPerSecond = m_format.sampleRate() * m_format.bytesPerFrame();
+ static const char *mediaRoleFromAudioRole[] = {
+ nullptr, // UnknownRole
+ "music", // MusicRole
+ "video", // VideoRole
+ "phone", // VoiceCommunicationRole
+ "event", // AlarmRole
+ "event", // NotificationRole
+ "phone", // RingtoneRole
+ "a11y", // AccessibilityRole
+ nullptr, // SonificationRole
+ "game" // GameRole
+ };
+
pa_proplist *propList = pa_proplist_new();
- if (!m_category.isNull())
- pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, m_category.toLatin1().constData());
+ const char *r = mediaRoleFromAudioRole[m_role];
+ if (r)
+ pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, r);
static const auto mapName = qEnvironmentVariable("QT_PA_CHANNEL_MAP");
pa_channel_map_def_t mapDef = PA_CHANNEL_MAP_DEFAULT;
@@ -346,9 +360,8 @@ bool QPulseAudioOutput::open()
pa_stream_set_overflow_callback(m_stream, outputStreamOverflowCallback, this);
pa_stream_set_latency_update_callback(m_stream, outputStreamLatencyCallback, this);
- if (m_bufferSize <= 0 && m_category == QLatin1String(LOW_LATENCY_CATEGORY_NAME)) {
+ if (m_bufferSize <= 0 && m_role == QAudio::GameRoleRole)
m_bufferSize = bytesPerSecond * LowLatencyBufferSizeMs / qint64(1000);
- }
pa_buffer_attr requestedBuffer;
requestedBuffer.fragsize = (uint32_t)-1;
@@ -372,7 +385,7 @@ bool QPulseAudioOutput::open()
pa_threaded_mainloop_wait(pulseEngine->mainloop());
const pa_buffer_attr *buffer = pa_stream_get_buffer_attr(m_stream);
- m_periodTime = (m_category == QLatin1String(LOW_LATENCY_CATEGORY_NAME)) ? LowLatencyPeriodTimeMs : PeriodTimeMs;
+ m_periodTime = (m_role == QAudio::GameRole) ? LowLatencyPeriodTimeMs : PeriodTimeMs;
m_periodSize = pa_usec_to_bytes(m_periodTime*1000, &m_spec);
m_bufferSize = buffer->tlength;
m_maxBufferSize = buffer->maxlength;
@@ -686,18 +699,6 @@ qreal QPulseAudioOutput::volume() const
return m_volume;
}
-void QPulseAudioOutput::setCategory(const QString &category)
-{
- if (m_category != category) {
- m_category = category;
- }
-}
-
-QString QPulseAudioOutput::category() const
-{
- return m_category;
-}
-
void QPulseAudioOutput::onPulseContextFailed()
{
close();
diff --git a/src/multimedia/platform/pulseaudio/qaudiooutput_pulse_p.h b/src/multimedia/platform/pulseaudio/qaudiooutput_pulse_p.h
index 9d73b60ab..c36a23d2f 100644
--- a/src/multimedia/platform/pulseaudio/qaudiooutput_pulse_p.h
+++ b/src/multimedia/platform/pulseaudio/qaudiooutput_pulse_p.h
@@ -94,9 +94,6 @@ public:
void setVolume(qreal volume) override;
qreal volume() const override;
- void setCategory(const QString &category) override;
- QString category() const override;
-
public:
void streamUnderflowCallback();
@@ -132,7 +129,6 @@ private:
char *m_audioBuffer;
qint64 m_elapsedTimeOffset;
bool m_resuming;
- QString m_category;
qreal m_volume;
pa_sample_spec m_spec;
diff --git a/src/multimedia/platform/qnx/audio/qnxaudiooutput.cpp b/src/multimedia/platform/qnx/audio/qnxaudiooutput.cpp
index 902ed6289..085032794 100644
--- a/src/multimedia/platform/qnx/audio/qnxaudiooutput.cpp
+++ b/src/multimedia/platform/qnx/audio/qnxaudiooutput.cpp
@@ -198,16 +198,6 @@ 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
@@ -454,6 +444,8 @@ void QnxAudioOutput::destroyPcmNotifiers()
void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *params)
{
+#if 0
+// Use some mapping from QAudio::Role
if (m_category.isEmpty())
return;
@@ -470,6 +462,7 @@ void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *params)
}
strcpy(params->audio_type_name, latin1Category.constData());
+#endif
}
void QnxAudioOutput::pcmNotifierActivated(int socket)
diff --git a/src/multimedia/platform/qnx/audio/qnxaudiooutput_p.h b/src/multimedia/platform/qnx/audio/qnxaudiooutput_p.h
index db4439d6d..14a7ceede 100644
--- a/src/multimedia/platform/qnx/audio/qnxaudiooutput_p.h
+++ b/src/multimedia/platform/qnx/audio/qnxaudiooutput_p.h
@@ -90,8 +90,6 @@ public:
QAudioFormat format() const override;
void setVolume(qreal volume) override;
qreal volume() const override;
- void setCategory(const QString &category) override;
- QString category() const override;
private slots:
void pullData();
@@ -121,7 +119,6 @@ private:
QAudio::State m_state;
QAudioFormat m_format;
qreal m_volume;
- QString m_category;
int m_periodSize;
snd_pcm_t *m_pcmHandle;