Jump to content

Qt for HarmonyOS/qtohosextras doc/Audio Stream Usage Hint Example - main.cpp

From Qt Wiki

Audio Stream Usage Hint Example - main.cpp

 // 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();
 }