From 728ea1670185972bbf21a46a447c80521f34350d Mon Sep 17 00:00:00 2001 From: tt2468 Date: Sun, 10 May 2020 18:39:24 -0700 Subject: [PATCH 1/3] Introduce `useDecibel` bool to `GetVolume` and `SetVolume` to give a better, built-in option for people to use decibels of attenuation instead of amplitude. --- src/WSRequestHandler_Sources.cpp | 53 +++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 579f76b4..44bf1b7c 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -156,12 +156,13 @@ RpcResponse WSRequestHandler::GetSourceTypesList(const RpcRequest& request) } /** -* Get the volume of the specified source. +* Get the volume of the specified source. Default response uses mul format, NOT SLIDER PERCENTAGE. * * @param {String} `source` Source name. +* @param {boolean (optional)} `useDecibel` Output volume in decibels of attenuation instead of amplitude/mul. * * @return {String} `name` Source name. -* @return {double} `volume` Volume of the source. Between `0.0` and `1.0`. +* @return {double} `volume` Volume of the source. Between `0.0` and `1.0` if using mul, under `0.0` if using dB (since it is attenuating). * @return {boolean} `muted` Indicates whether the source is muted. * * @api requests @@ -175,6 +176,11 @@ RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request) return request.failed("missing request parameters"); } + bool useDecibel = false; + if (request.hasField("useDecibel")) { + useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); + } + QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { return request.failed("invalid request parameters"); @@ -187,33 +193,45 @@ RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request) OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "name", obs_source_get_name(source)); - obs_data_set_double(response, "volume", obs_source_get_volume(source)); + if (!useDecibel) { + obs_data_set_double(response, "volume", obs_source_get_volume(source)); + } else { + float volume = obs_source_get_volume(source); + obs_data_set_double(response, "volume", obs_mul_to_db(volume)); + } obs_data_set_bool(response, "muted", obs_source_muted(source)); return request.success(response); } /** - * Set the volume of the specified source. - * - * @param {String} `source` Source name. - * @param {double} `volume` Desired volume. Must be between `0.0` and `1.0`. - * - * @api requests - * @name SetVolume - * @category sources - * @since 4.0.0 - */ +* Set the volume of the specified source. Default request format uses mul, NOT SLIDER PERCENTAGE. +* +* @param {String} `source` Source name. +* @param {double} `volume` Desired volume. Must be between `0.0` and `1.0` for mul, and under 0.0 for dB. Note: OBS will interpret dB values under -100.0 as Inf. +* @param {boolean (optional)} `useDecibel` Interperet `volume` data as decibels instead of amplitude/mul. +* +* @api requests +* @name SetVolume +* @category sources +* @since 4.0.0 +*/ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) { if (!request.hasField("source") || !request.hasField("volume")) { return request.failed("missing request parameters"); } + bool useDecibel = false; + if (request.hasField("useDecibel")) { + useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); + } + QString sourceName = obs_data_get_string(request.parameters(), "source"); float sourceVolume = obs_data_get_double(request.parameters(), "volume"); - if (sourceName.isEmpty() || sourceVolume < 0.0 || sourceVolume > 1.0) { + if ((useDecibel && sourceVolume > 0.0) || +(!useDecibel && (sourceVolume < 0.0 || sourceVolume > 1.0)) || (sourceName.isEmpty())) { return request.failed("invalid request parameters"); } @@ -222,7 +240,12 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) return request.failed("specified source doesn't exist"); } - obs_source_set_volume(source, sourceVolume); + if (!useDecibel) { + obs_source_set_volume(source, sourceVolume); + } else { + float mul = obs_db_to_mul(sourceVolume); + obs_source_set_volume(source, mul); + } return request.success(); } From ba4e5959b10d274eb3498afdd7981fb310331d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 14 May 2020 22:24:58 +0200 Subject: [PATCH 2/3] requests(Get/SetVolume): code nitpicks --- src/WSRequestHandler_Sources.cpp | 34 ++++++++++++-------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 44bf1b7c..3ca1a82b 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -176,11 +176,6 @@ RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request) return request.failed("missing request parameters"); } - bool useDecibel = false; - if (request.hasField("useDecibel")) { - useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); - } - QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { return request.failed("invalid request parameters"); @@ -191,16 +186,17 @@ RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request) return request.failed("specified source doesn't exist"); } + float volume = obs_source_get_volume(source); + + bool useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); + if (useDecibel) { + volume = obs_mul_to_db(volume); + } + OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "name", obs_source_get_name(source)); - if (!useDecibel) { - obs_data_set_double(response, "volume", obs_source_get_volume(source)); - } else { - float volume = obs_source_get_volume(source); - obs_data_set_double(response, "volume", obs_mul_to_db(volume)); - } + obs_data_set_double(response, "volume", volume); obs_data_set_bool(response, "muted", obs_source_muted(source)); - return request.success(response); } @@ -222,10 +218,7 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) return request.failed("missing request parameters"); } - bool useDecibel = false; - if (request.hasField("useDecibel")) { - useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); - } + bool useDecibel = obs_data_get_bool(request.parameters(), "useDecibel"); QString sourceName = obs_data_get_string(request.parameters(), "source"); float sourceVolume = obs_data_get_double(request.parameters(), "volume"); @@ -240,12 +233,11 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) return request.failed("specified source doesn't exist"); } - if (!useDecibel) { - obs_source_set_volume(source, sourceVolume); - } else { - float mul = obs_db_to_mul(sourceVolume); - obs_source_set_volume(source, mul); + if (useDecibel) { + sourceVolume = obs_db_to_mul(sourceVolume); } + obs_source_set_volume(source, sourceVolume); + return request.success(); } From 1c85894472f88cbb4c9c409d6379f13d4ddbb6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 14 May 2020 22:31:10 +0200 Subject: [PATCH 3/3] request(SetVolume): simplified params check --- src/WSRequestHandler_Sources.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 3ca1a82b..7f4df0d1 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -223,8 +223,9 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) QString sourceName = obs_data_get_string(request.parameters(), "source"); float sourceVolume = obs_data_get_double(request.parameters(), "volume"); - if ((useDecibel && sourceVolume > 0.0) || -(!useDecibel && (sourceVolume < 0.0 || sourceVolume > 1.0)) || (sourceName.isEmpty())) { + bool isNotValidDecibel = (useDecibel && sourceVolume > 0.0); + bool isNotValidMul = (!useDecibel && (sourceVolume < 0.0 || sourceVolume > 1.0)); + if (sourceName.isEmpty() || isNotValidDecibel || isNotValidMul) { return request.failed("invalid request parameters"); }