// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QApplication>
#include <QComboBox>
#include <QMetaEnum>
#include <QPointer>
#include <QPushButton>
#include <QSound>
#include <QSoundEffect>
#include <QTimer>
#include <QUrl>
#include <QVBoxLayout>
#include <QWidget>
#include <QtOhosExtras>
#include <chrono>
class AudioStreamUsageDemo : public QWidget
{
public:
explicit AudioStreamUsageDemo();
private:
QtOhosExtras::Multimedia::AudioStreamUsageHint selectedAudioRole() const;
void playSound();
void playSoundEffect();
private:
QComboBox *m_comboBox;
};
AudioStreamUsageDemo::AudioStreamUsageDemo()
: QWidget()
, m_comboBox(new QComboBox(this))
{
auto usageHintMeta = QMetaEnum::fromType<QtOhosExtras::Multimedia::AudioStreamUsageHint>();
for (int i = 0; i < usageHintMeta.keyCount(); ++i) {
m_comboBox->addItem(QString::fromUtf8(usageHintMeta.key(i)));
}
auto *playSoundEffectButton = new QPushButton(QStringLiteral("Play by QSoundEffect"), this);
connect(playSoundEffectButton, &QPushButton::clicked, this, &AudioStreamUsageDemo::playSoundEffect);
auto *playSoundButton = new QPushButton(QStringLiteral("Play by QSound"), this);
connect(playSoundButton, &QPushButton::clicked, this, &AudioStreamUsageDemo::playSound);
auto *layout = new QVBoxLayout(this);
layout->addWidget(m_comboBox);
layout->addWidget(playSoundEffectButton);
layout->addWidget(playSoundButton);
}
QtOhosExtras::Multimedia::AudioStreamUsageHint AudioStreamUsageDemo::selectedAudioRole() const
{
auto usageHintMeta = QMetaEnum::fromType<QtOhosExtras::Multimedia::AudioStreamUsageHint>();
int audioRole = usageHintMeta.value(m_comboBox->currentIndex());
return static_cast<QtOhosExtras::Multimedia::AudioStreamUsageHint>(audioRole);
}
void AudioStreamUsageDemo::playSound()
{
auto *sound = new QSound(QString::fromLatin1(":/test.wav"), this);
QtOhosExtras::Multimedia::setAudioStreamUsageHintProperty(sound, selectedAudioRole());
auto *soundTimer = new QTimer(sound);
soundTimer->setInterval(std::chrono::seconds(1));
soundTimer->callOnTimeout(sound, [sound = QPointer<QSound>(sound)]() {
if (sound != nullptr && sound->isFinished()) {
sound->deleteLater();
}
});
soundTimer->start();
sound->play();
}
void AudioStreamUsageDemo::playSoundEffect()
{
auto *soundEffect = new QSoundEffect(this);
QtOhosExtras::Multimedia::setAudioStreamUsageHintProperty(soundEffect, selectedAudioRole());
soundEffect->setSource(QUrl(QString::fromLatin1("qrc:/test.wav")));
soundEffect->setLoopCount(1);
connect(
soundEffect, &QSoundEffect::playingChanged,
soundEffect, [soundEffect = QPointer<QSoundEffect>(soundEffect)]() {
if (soundEffect != nullptr && !soundEffect->isPlaying()) {
soundEffect->deleteLater();
}
});
soundEffect->play();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
AudioStreamUsageDemo player;
player.show();
return app.exec();
}