diff options
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; |