From 88c72cd80a2d3f2405bdab23ca5c757617c7f151 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Sun, 10 May 2020 20:07:57 -0700 Subject: [PATCH 1/3] Add audio monitoring request items. --- src/WSRequestHandler.cpp | 2 + src/WSRequestHandler.h | 2 + src/WSRequestHandler_Sources.cpp | 93 ++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index f2ae6c47..58cddc23 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -97,6 +97,8 @@ const QHash WSRequestHandler::messageMap { { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, + { "GetAudioMonitor", &WSRequestHandler::GetAudioMonitor }, + { "SetAudioMonitor", &WSRequestHandler::SetAudioMonitor }, { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index d17384ee..b55c2fb5 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -112,6 +112,8 @@ class WSRequestHandler { RpcResponse GetSourceTypesList(const RpcRequest&); RpcResponse GetSourceSettings(const RpcRequest&); RpcResponse SetSourceSettings(const RpcRequest&); + RpcResponse GetAudioMonitor(const RpcRequest&); + RpcResponse SetAudioMonitor(const RpcRequest&); RpcResponse TakeSourceScreenshot(const RpcRequest&); RpcResponse GetSourceFilters(const RpcRequest&); diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 579f76b4..12bce74c 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -1424,6 +1424,99 @@ RpcResponse WSRequestHandler::SetSourceFilterVisibility(const RpcRequest& reques return request.success(); } +/** +* Get the audio monitoring type of the specified source. +* +* @param {String} `sourceName` Source name. +* +* @return {String} `monitorType` The monitor type in use. Options: `none`, `monitor_only`, `monitor_and_output`. +* +* @api requests +* @name GetAudioMonitor +* @category sources +* @since 4.8.0 +*/ +RpcResponse WSRequestHandler::GetAudioMonitor(const RpcRequest& request) + { + if (!request.hasField("sourceName")) { + return request.failed("missing request parameters"); + } + + QString sourceName = obs_data_get_string(request.parameters(), "sourceName"); + + if (sourceName.isEmpty()) { + return request.failed("invalid request parameters"); + } + + OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); + if (!source) { + return request.failed("specified source doesn't exist"); + } + + OBSDataAutoRelease response = obs_data_create(); + + QString monitorType; + enum obs_monitoring_type mtype = obs_source_get_monitoring_type(source); + switch (mtype) { + case OBS_MONITORING_TYPE_NONE: + monitorType = "none"; + break; + case OBS_MONITORING_TYPE_MONITOR_ONLY: + monitorType = "monitor_only"; + break; + case OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT: + monitorType = "monitor_and_output"; + break; + default: + monitorType = "unknown"; + break; + } + obs_data_set_string(response, "monitorType", monitorType.toUtf8()); + + return request.success(response); +} + +/** +* Set the audio monitoring type of the specified source. +* +* @param {String} `sourceName` Source name. +* @param {String} `monitorType` The monitor type to use. Options: `none`, `monitor_only`, `monitor_and_output`. +* +* @api requests +* @name SetAudioMonitor +* @category sources +* @since 4.8.0 +*/ +RpcResponse WSRequestHandler::SetAudioMonitor(const RpcRequest& request) + { + if (!request.hasField("sourceName") || !request.hasField("monitorType")) { + return request.failed("missing request parameters"); + } + + QString sourceName = obs_data_get_string(request.parameters(), "sourceName"); + QString monitorType = obs_data_get_string(request.parameters(), "monitorType"); + + if (sourceName.isEmpty() || monitorType.isEmpty()) { + return request.failed("invalid request parameters"); + } + + OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); + if (!source) { + return request.failed("specified source doesn't exist"); + } + + if (monitorType == "none") { + obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_NONE); + } else if (monitorType == "monitor_only") { + obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_MONITOR_ONLY); + } else if (monitorType == "monitor_and_output") { + obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT); + } else { + return request.failed("invalid monitorType"); + } + return request.success(); +} + /** * Takes a picture snapshot of a source and then can either or both: * - Send it over as a Data URI (base64-encoded data) in the response (by specifying `embedPictureFormat` in the request) From 0b0560019a3426539f7b67ef49cfda92b3bba2e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 May 2020 04:08:40 +0200 Subject: [PATCH 2/3] requests(Get/SetAudioMonitor): change values to camelCase for consistency --- src/WSRequestHandler_Sources.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 26db95f6..73ddae9f 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -1431,7 +1431,7 @@ RpcResponse WSRequestHandler::SetSourceFilterVisibility(const RpcRequest& reques * * @param {String} `sourceName` Source name. * -* @return {String} `monitorType` The monitor type in use. Options: `none`, `monitor_only`, `monitor_and_output`. +* @return {String} `monitorType` The monitor type in use. Options: `none`, `monitorOnly`, `monitorAndOutput`. * * @api requests * @name GetAudioMonitor @@ -1464,10 +1464,10 @@ RpcResponse WSRequestHandler::GetAudioMonitor(const RpcRequest& request) monitorType = "none"; break; case OBS_MONITORING_TYPE_MONITOR_ONLY: - monitorType = "monitor_only"; + monitorType = "monitorOnly"; break; case OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT: - monitorType = "monitor_and_output"; + monitorType = "monitorAndOutput"; break; default: monitorType = "unknown"; @@ -1482,7 +1482,7 @@ RpcResponse WSRequestHandler::GetAudioMonitor(const RpcRequest& request) * Set the audio monitoring type of the specified source. * * @param {String} `sourceName` Source name. -* @param {String} `monitorType` The monitor type to use. Options: `none`, `monitor_only`, `monitor_and_output`. +* @param {String} `monitorType` The monitor type to use. Options: `none`, `monitorOnly`, `monitorAndOutput`. * * @api requests * @name SetAudioMonitor @@ -1509,9 +1509,9 @@ RpcResponse WSRequestHandler::SetAudioMonitor(const RpcRequest& request) if (monitorType == "none") { obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_NONE); - } else if (monitorType == "monitor_only") { + } else if (monitorType == "monitorOnly") { obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_MONITOR_ONLY); - } else if (monitorType == "monitor_and_output") { + } else if (monitorType == "monitorAndOutput") { obs_source_set_monitoring_type(source, OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT); } else { return request.failed("invalid monitorType"); From f8c8e42ae97675298b5bf1b874a2d65c96d6c602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 May 2020 04:10:40 +0200 Subject: [PATCH 3/3] requests: rename Get/SetAudioMonitor to Get/SetAudioMonitorType --- src/WSRequestHandler.cpp | 4 ++-- src/WSRequestHandler.h | 4 ++-- src/WSRequestHandler_Sources.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 58cddc23..86a9df70 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -97,8 +97,8 @@ const QHash WSRequestHandler::messageMap { { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, - { "GetAudioMonitor", &WSRequestHandler::GetAudioMonitor }, - { "SetAudioMonitor", &WSRequestHandler::SetAudioMonitor }, + { "GetAudioMonitorType", &WSRequestHandler::GetAudioMonitorType }, + { "SetAudioMonitorType", &WSRequestHandler::SetAudioMonitorType }, { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index b55c2fb5..300915e7 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -112,8 +112,8 @@ class WSRequestHandler { RpcResponse GetSourceTypesList(const RpcRequest&); RpcResponse GetSourceSettings(const RpcRequest&); RpcResponse SetSourceSettings(const RpcRequest&); - RpcResponse GetAudioMonitor(const RpcRequest&); - RpcResponse SetAudioMonitor(const RpcRequest&); + RpcResponse GetAudioMonitorType(const RpcRequest&); + RpcResponse SetAudioMonitorType(const RpcRequest&); RpcResponse TakeSourceScreenshot(const RpcRequest&); RpcResponse GetSourceFilters(const RpcRequest&); diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 73ddae9f..f71a3518 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -1434,11 +1434,11 @@ RpcResponse WSRequestHandler::SetSourceFilterVisibility(const RpcRequest& reques * @return {String} `monitorType` The monitor type in use. Options: `none`, `monitorOnly`, `monitorAndOutput`. * * @api requests -* @name GetAudioMonitor +* @name GetAudioMonitorType * @category sources * @since 4.8.0 */ -RpcResponse WSRequestHandler::GetAudioMonitor(const RpcRequest& request) +RpcResponse WSRequestHandler::GetAudioMonitorType(const RpcRequest& request) { if (!request.hasField("sourceName")) { return request.failed("missing request parameters"); @@ -1485,11 +1485,11 @@ RpcResponse WSRequestHandler::GetAudioMonitor(const RpcRequest& request) * @param {String} `monitorType` The monitor type to use. Options: `none`, `monitorOnly`, `monitorAndOutput`. * * @api requests -* @name SetAudioMonitor +* @name SetAudioMonitorType * @category sources * @since 4.8.0 */ -RpcResponse WSRequestHandler::SetAudioMonitor(const RpcRequest& request) +RpcResponse WSRequestHandler::SetAudioMonitorType(const RpcRequest& request) { if (!request.hasField("sourceName") || !request.hasField("monitorType")) { return request.failed("missing request parameters");