From 152f8d95b00f271d7e6522f33ffe4bfa7ea02618 Mon Sep 17 00:00:00 2001 From: Martin Piatka Date: Mon, 15 Mar 2021 14:28:29 +0100 Subject: [PATCH] GUI: Parse embedded audio support --- gui/QT/option/audio_opts.cpp | 48 +++++----------------------- gui/QT/option/available_settings.cpp | 9 ++++++ gui/QT/option/available_settings.hpp | 3 ++ gui/QT/option/settings.cpp | 4 ++- gui/QT/option/video_opts.cpp | 12 +++++++ 5 files changed, 35 insertions(+), 41 deletions(-) diff --git a/gui/QT/option/audio_opts.cpp b/gui/QT/option/audio_opts.cpp index 71b0cee1a..b3a5c4bcc 100644 --- a/gui/QT/option/audio_opts.cpp +++ b/gui/QT/option/audio_opts.cpp @@ -24,34 +24,6 @@ std::vector getAudioCompress(AvailableSettings *availSettings){ return res; } -const char * const sdiAudioCards[] = { - "decklink", - "aja", - "dvs", - "deltacast", - "ndi", -}; - -const char * const sdiAudio[] = { - "analog", - "AESEBU", - "embedded", -}; - -static std::vector> getSdiCond(const std::string &opt){ - std::vector> res; - - std::vector clause; - - for(const auto &i : sdiAudioCards){ - clause.push_back({{opt, i}, false}); - } - - res.push_back(std::move(clause)); - - return res; -} - std::vector getAudioPlayback(AvailableSettings *availSettings){ const std::string optStr = "audio.playback"; std::vector res; @@ -66,12 +38,10 @@ std::vector getAudioPlayback(AvailableSettings *availSettings){ item.name = i.name; item.opts.push_back({optStr, i.type}); item.opts.push_back({optStr + "." + i.type + ".device", i.deviceOpt}); - for(const auto &sdi : sdiAudio){ - if(std::strcmp(sdi, i.type.c_str()) == 0){ - item.conditions = getSdiCond("video.display"); - break; - } - } + auto embedAudioIt = i.extra.find("isEmbeddedAudio"); + if(embedAudioIt != i.extra.end() && embedAudioIt->second == "t"){ + item.conditions.push_back({{{"video.display.embeddedAudioAvailable", "t"}, false}}); + } res.push_back(std::move(item)); } @@ -92,12 +62,10 @@ std::vector getAudioSrc(AvailableSettings *availSettings){ item.name = i.name; item.opts.push_back({optStr, i.type}); item.opts.push_back({optStr + "." + i.type + ".device", i.deviceOpt}); - for(const auto &sdi : sdiAudio){ - if(std::strcmp(sdi, i.type.c_str()) == 0){ - item.conditions = getSdiCond("video.source"); - break; - } - } + auto embedAudioIt = i.extra.find("isEmbeddedAudio"); + if(embedAudioIt != i.extra.end() && embedAudioIt->second == "t"){ + item.conditions.push_back({{{"video.source.embeddedAudioAvailable", "t"}, false}}); + } res.push_back(std::move(item)); } diff --git a/gui/QT/option/available_settings.cpp b/gui/QT/option/available_settings.cpp index b780a8f79..2383dd6ae 100644 --- a/gui/QT/option/available_settings.cpp +++ b/gui/QT/option/available_settings.cpp @@ -212,6 +212,15 @@ void AvailableSettings::queryDevice(const QString &line, size_t offset){ maybeWriteString(obj, "module", dev.type); maybeWriteString(obj, "device", dev.deviceOpt); + if(obj.contains("extra") && obj["extra"].isObject()){ + const auto& extraObj = obj["extra"].toObject(); + for(auto it = extraObj.constBegin(); it != extraObj.constEnd(); it++){ + if(it.value().isString()){ + dev.extra[it.key().toStdString()] = it.value().toString().toStdString(); + } + } + } + if(obj.contains("modes") && obj["modes"].isArray()){ for(const QJsonValue &val : obj["modes"].toArray()){ if(val.isObject()){ diff --git a/gui/QT/option/available_settings.hpp b/gui/QT/option/available_settings.hpp index 99d1b6b69..ae42f7501 100644 --- a/gui/QT/option/available_settings.hpp +++ b/gui/QT/option/available_settings.hpp @@ -3,6 +3,7 @@ #include #include +#include #include enum SettingType{ @@ -32,6 +33,8 @@ struct Device{ std::string type; std::string deviceOpt; + std::map extra; + std::vector modes; }; diff --git a/gui/QT/option/settings.cpp b/gui/QT/option/settings.cpp index c26194397..08f6f1b2d 100644 --- a/gui/QT/option/settings.cpp +++ b/gui/QT/option/settings.cpp @@ -198,6 +198,7 @@ const static struct{ const char *limit; } optionList[] = { {"video.source", Option::StringOpt, " -t ", "", false, "", ""}, + {"video.source.embeddedAudioAvailable", Option::SilentOpt, "", "", false, "", ""}, {"testcard.width", Option::StringOpt, ":", "", false, "video.source", "testcard"}, {"testcard.height", Option::StringOpt, ":", "", false, "video.source", "testcard"}, {"testcard.fps", Option::StringOpt, ":", "", false, "video.source", "testcard"}, @@ -213,6 +214,7 @@ const static struct{ {"avfoundation.fps", Option::StringOpt, ":fps=", "", false, "video.source", "avfoundation"}, {"decklink.modeOpt", Option::StringOpt, ":", "", false, "video.source", "decklink"}, {"video.display", Option::StringOpt, " -d ", "", false, "", ""}, + {"video.display.embeddedAudioAvailable", Option::SilentOpt, "", "", false, "", ""}, {"gl.novsync", Option::BoolOpt, ":novsync", "f", false, "video.display", "gl"}, {"gl.deinterlace", Option::BoolOpt, ":d", "f", false, "video.display", "gl"}, {"gl.fullscreen", Option::BoolOpt, ":fs", "f", false, "video.display", "gl"}, @@ -268,7 +270,7 @@ Settings::Settings() : dummy(this){ i.limit); #ifdef DEBUG if(!i.parent[0]) - opt.addOnChangeCallback(test_callback); + opt.addOnChangeCallback(Option::Callback(test_callback, nullptr)); #endif (void) opt; //suppress unused warning } diff --git a/gui/QT/option/video_opts.cpp b/gui/QT/option/video_opts.cpp index cb22481c6..c39c6c9c7 100644 --- a/gui/QT/option/video_opts.cpp +++ b/gui/QT/option/video_opts.cpp @@ -16,6 +16,7 @@ std::vector getVideoSrc(AvailableSettings *availSettings){ SettingItem defaultItem; defaultItem.name = "None"; defaultItem.opts.push_back({optStr, ""}); + defaultItem.opts.push_back({"video.source.embeddedAudioAvailable", "f"}); res.push_back(std::move(defaultItem)); for(const auto &i : availSettings->getDevices(VIDEO_SRC)){ @@ -23,6 +24,11 @@ std::vector getVideoSrc(AvailableSettings *availSettings){ item.name = i.name; item.opts.push_back({optStr, i.type}); item.opts.push_back({optStr + "." + i.type + ".device", i.deviceOpt}); + auto embedAudioIt = i.extra.find("embeddedAudioAvailable"); + bool enableAudio = embedAudioIt != i.extra.end() + && embedAudioIt->second == "t"; + item.opts.push_back({"video.source.embeddedAudioAvailable", + enableAudio ? "t" : "f"}); res.push_back(std::move(item)); } @@ -78,12 +84,18 @@ std::vector getVideoDisplay(AvailableSettings *availSettings){ SettingItem defaultItem; defaultItem.name = "None"; defaultItem.opts.push_back({optStr, ""}); + defaultItem.opts.push_back({"video.display.embeddedAudioAvailable", "f"}); res.push_back(std::move(defaultItem)); for(const auto &i : availSettings->getDevices(VIDEO_DISPLAY)){ SettingItem item; item.name = i.name; item.opts.push_back({optStr, i.type}); + auto embedAudioIt = i.extra.find("embeddedAudioAvailable"); + bool enableAudio = embedAudioIt != i.extra.end() + && embedAudioIt->second == "t"; + item.opts.push_back({"video.display.embeddedAudioAvailable", + enableAudio ? "t" : "f"}); res.push_back(std::move(item)); }