Merge pull request #495 from Palakis/volume-decibel-support

Requests: Add useDecibel bool to GetVolume and SetVolume
This commit is contained in:
Stéphane Lepin 2020-05-14 22:47:33 +02:00 committed by GitHub
commit 33b080b3b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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 {String} `source` Source name.
* @param {boolean (optional)} `useDecibel` Output volume in decibels of attenuation instead of amplitude/mul.
* *
* @return {String} `name` Source name. * @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. * @return {boolean} `muted` Indicates whether the source is muted.
* *
* @api requests * @api requests
@ -185,35 +186,46 @@ RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request)
return request.failed("specified source doesn't exist"); 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(); OBSDataAutoRelease response = obs_data_create();
obs_data_set_string(response, "name", obs_source_get_name(source)); obs_data_set_string(response, "name", obs_source_get_name(source));
obs_data_set_double(response, "volume", obs_source_get_volume(source)); obs_data_set_double(response, "volume", volume);
obs_data_set_bool(response, "muted", obs_source_muted(source)); obs_data_set_bool(response, "muted", obs_source_muted(source));
return request.success(response); return request.success(response);
} }
/** /**
* Set the volume of the specified source. * Set the volume of the specified source. Default request format uses mul, NOT SLIDER PERCENTAGE.
* *
* @param {String} `source` Source name. * @param {String} `source` Source name.
* @param {double} `volume` Desired volume. Must be between `0.0` and `1.0`. * @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 * @api requests
* @category sources * @name SetVolume
* @since 4.0.0 * @category sources
*/ * @since 4.0.0
*/
RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request)
{ {
if (!request.hasField("source") || !request.hasField("volume")) { if (!request.hasField("source") || !request.hasField("volume")) {
return request.failed("missing request parameters"); return request.failed("missing request parameters");
} }
bool useDecibel = obs_data_get_bool(request.parameters(), "useDecibel");
QString sourceName = obs_data_get_string(request.parameters(), "source"); QString sourceName = obs_data_get_string(request.parameters(), "source");
float sourceVolume = obs_data_get_double(request.parameters(), "volume"); float sourceVolume = obs_data_get_double(request.parameters(), "volume");
if (sourceName.isEmpty() || sourceVolume < 0.0 || sourceVolume > 1.0) { 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"); return request.failed("invalid request parameters");
} }
@ -222,7 +234,11 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request)
return request.failed("specified source doesn't exist"); return request.failed("specified source doesn't exist");
} }
if (useDecibel) {
sourceVolume = obs_db_to_mul(sourceVolume);
}
obs_source_set_volume(source, sourceVolume); obs_source_set_volume(source, sourceVolume);
return request.success(); return request.success();
} }