summaryrefslogtreecommitdiffstats
path: root/src/plugins/qnx/mediaplayer/mmrendererutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qnx/mediaplayer/mmrendererutil.cpp')
-rw-r--r--src/plugins/qnx/mediaplayer/mmrendererutil.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp
index 239d9d52e..7a9f6393b 100644
--- a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp
+++ b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp
@@ -41,6 +41,11 @@
#include <QDebug>
#include <QDir>
#include <QFile>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonValue>
+#include <QMutex>
+#include <QMutex>
#include <QString>
#include <QXmlStreamReader>
@@ -85,6 +90,91 @@ static const MmError mmErrors[] = {
};
static const unsigned int numMmErrors = sizeof(mmErrors) / sizeof(MmError);
+static QBasicMutex roleMapMutex;
+static bool roleMapInitialized = false;
+static QString roleMap[QAudio::GameRole + 1];
+
+template <typename T, size_t N>
+constexpr size_t countof(T (&)[N])
+{
+ return N;
+}
+
+constexpr bool inBounds(QAudio::Role r)
+{
+ return r >= 0 && r < countof(roleMap);
+}
+
+QString keyValueMapsLocation()
+{
+ QByteArray qtKeyValueMaps = qgetenv("QT_KEY_VALUE_MAPS");
+ if (qtKeyValueMaps.isNull())
+ return QStringLiteral("/etc/qt/keyvaluemaps");
+ else
+ return qtKeyValueMaps;
+}
+
+QJsonObject loadMapObject(const QString &keyValueMapPath)
+{
+ QFile mapFile(keyValueMapsLocation() + keyValueMapPath);
+ if (mapFile.open(QIODevice::ReadOnly)) {
+ QByteArray mapFileContents = mapFile.readAll();
+ QJsonDocument mapDocument = QJsonDocument::fromJson(mapFileContents);
+ if (mapDocument.isObject()) {
+ QJsonObject mapObject = mapDocument.object();
+ return mapObject;
+ }
+ }
+ return QJsonObject();
+}
+
+static void loadRoleMap()
+{
+ QMutexLocker locker(&roleMapMutex);
+
+ if (!roleMapInitialized) {
+ QJsonObject mapObject = loadMapObject("/QAudio/Role.json");
+ if (!mapObject.isEmpty()) {
+ // Wrapping the loads in a switch like this ensures that anyone adding
+ // a new enumerator will be notified that this code must be updated. A
+ // compile error will occur because the enumerator is missing from the
+ // switch. A compile error will also occur if the enumerator used to
+ // size the mapping table isn't updated when a new enumerator is added.
+ // One or more enumerators will be outside the bounds of the array when
+ // the wrong enumerator is used to size the array.
+ //
+ // The code loads a mapping for each enumerator because role is set
+ // to UnknownRole and all the cases drop through to the next case.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic error "-Wswitch"
+#define loadRoleMapping(r) \
+ case QAudio::r: \
+ static_assert(inBounds(QAudio::r), #r " out-of-bounds." \
+ " Do you need to change the enumerator used to size the mapping table" \
+ " because you added new QAudio::Role enumerators?"); \
+ roleMap[QAudio::r] = mapObject.value(QLatin1String(#r)).toString();
+
+ QAudio::Role role = QAudio::UnknownRole;
+ switch (role) {
+ loadRoleMapping(UnknownRole);
+ loadRoleMapping(MusicRole);
+ loadRoleMapping(VideoRole);
+ loadRoleMapping(VoiceCommunicationRole);
+ loadRoleMapping(AlarmRole);
+ loadRoleMapping(NotificationRole);
+ loadRoleMapping(RingtoneRole);
+ loadRoleMapping(AccessibilityRole);
+ loadRoleMapping(SonificationRole);
+ loadRoleMapping(GameRole);
+ }
+#undef loadRoleMapping
+#pragma GCC diagnostic pop
+ }
+
+ roleMapInitialized = true;
+ }
+}
+
QString mmErrorMessage(const QString &msg, mmr_context_t *context, int *errorCode)
{
const mmr_error_info_t * const mmError = mmr_error_info(context);
@@ -124,4 +214,27 @@ bool checkForDrmPermission()
return false;
}
+QString qnxAudioType(QAudio::Role role)
+{
+ loadRoleMap();
+
+ if (role >= 0 && role < countof(roleMap))
+ return roleMap[role];
+ else
+ return QString();
+}
+
+QList<QAudio::Role> qnxSupportedAudioRoles()
+{
+ loadRoleMap();
+
+ QList<QAudio::Role> result;
+ for (size_t i = 0; i < countof(roleMap); ++i) {
+ if (!roleMap[i].isEmpty() || (i == QAudio::UnknownRole))
+ result.append(static_cast<QAudio::Role>(i));
+ }
+
+ return result;
+}
+
QT_END_NAMESPACE