Search code examples
iosiphoneaudioqmlmultimedia

Play audio files on iOS in a QML program


In the QML project below, I want to play the audio file (kimya.mp3, in the sounds folder in the project's directory) when the project is installed on iOS, by touching the green rectangle on the screen.

The .pro file:

QT += quick multimedia
CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

ios {
    APP_Sounds.files = $$PWD/sounds/kimya.mp3
    APP_Sounds.path = sounds
    QMAKE_BUNDLE_DATA += APP_Sounds
}

The main.cpp file: (intact, without changes)

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;   
    return app.exec();
}

And, this is main.qml:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtMultimedia 5.12

Window {
    visible: true
    width: 640; height: 480
    title: qsTr("Hello World")

    Rectangle {
        width: 100; height: 100
        color: "green"
        anchors.centerIn: parent

        MouseArea {
            anchors.fill: parent
            onClicked: playExplosion.play()
        }
    }

     SoundEffect {
        id: playExplosion
        source: "file:///Users/Me/QML/soundTest/soundTest/sounds/kimya.mp3"
    }
}

The audio file plays on other platforms, say Windows, Android and even Mac, but I don't know where in the code is faulty that when I install this project on iOS whatever I touch the green rectangle, no sound is played!
Do you have any experience in this case, please?


Solution

  • The way more simple is to add the sound file to the qrc and do:

    SoundEffect { id: playExplosion source: "qrc:/assets/test.wav" volume: 1.0 }