GUI: Parse embedded audio support

This commit is contained in:
Martin Piatka
2021-03-15 14:28:29 +01:00
parent cbbc93340e
commit 152f8d95b0
5 changed files with 35 additions and 41 deletions

View File

@@ -24,34 +24,6 @@ std::vector<SettingItem> getAudioCompress(AvailableSettings *availSettings){
return res;
}
const char * const sdiAudioCards[] = {
"decklink",
"aja",
"dvs",
"deltacast",
"ndi",
};
const char * const sdiAudio[] = {
"analog",
"AESEBU",
"embedded",
};
static std::vector<std::vector<ConditionItem>> getSdiCond(const std::string &opt){
std::vector<std::vector<ConditionItem>> res;
std::vector<ConditionItem> clause;
for(const auto &i : sdiAudioCards){
clause.push_back({{opt, i}, false});
}
res.push_back(std::move(clause));
return res;
}
std::vector<SettingItem> getAudioPlayback(AvailableSettings *availSettings){
const std::string optStr = "audio.playback";
std::vector<SettingItem> res;
@@ -66,12 +38,10 @@ std::vector<SettingItem> 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<SettingItem> 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));
}

View File

@@ -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()){

View File

@@ -3,6 +3,7 @@
#include <string>
#include <vector>
#include <map>
#include <QStringList>
enum SettingType{
@@ -32,6 +33,8 @@ struct Device{
std::string type;
std::string deviceOpt;
std::map<std::string, std::string> extra;
std::vector<DeviceMode> modes;
};

View File

@@ -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
}

View File

@@ -16,6 +16,7 @@ std::vector<SettingItem> 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<SettingItem> 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<SettingItem> 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));
}