Requests: Add SetAudioTracks and GetAudioTracks (#690)

* Requests: Add SetAudioTracks and GetAudioTracks

* Renamed mixer to track.

* Fix: Prevent pushing track out of range

* Fix: Changed result values back to track.

* Fix: Changed source parameter to sourceName.

* Fix: Updated @param.

* Revert "Fix: Updated @param."

This reverts commit 24a5eb6fabf9ddccd1bd0176cb695408e46306f9.
This commit is contained in:
Blake B 2021-03-19 01:02:30 -04:00 committed by GitHub
parent 01c898b104
commit b13822db8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 0 deletions

View File

@ -121,6 +121,8 @@ const QHash<QString, RpcMethodHandler> WSRequestHandler::messageMap{
{ "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList },
{ "GetVolume", &WSRequestHandler::GetVolume },
{ "SetVolume", &WSRequestHandler::SetVolume },
{ "SetAudioTracks", &WSRequestHandler::SetAudioTracks },
{ "GetAudioTracks", &WSRequestHandler::GetAudioTracks },
{ "GetMute", &WSRequestHandler::GetMute },
{ "SetMute", &WSRequestHandler::SetMute },
{ "ToggleMute", &WSRequestHandler::ToggleMute },

View File

@ -138,6 +138,8 @@ class WSRequestHandler {
RpcResponse GetSourceTypesList(const RpcRequest&);
RpcResponse GetVolume(const RpcRequest&);
RpcResponse SetVolume(const RpcRequest&);
RpcResponse SetAudioTracks(const RpcRequest&);
RpcResponse GetAudioTracks(const RpcRequest&);
RpcResponse GetMute(const RpcRequest&);
RpcResponse SetMute(const RpcRequest&);
RpcResponse ToggleMute(const RpcRequest&);

View File

@ -315,6 +315,96 @@ RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request)
return request.success();
}
/**
* Changes whether an audio track is active for a source.
*
* @param {String} `sourceName` Source name.
* @param {int} `track` Audio tracks 1-6.
* @param {boolean} `active` Whether audio track is active or not.
*
* @api requests
* @name SetTracks
* @category sources
* @since unreleased
*/
RpcResponse WSRequestHandler::SetAudioTracks(const RpcRequest& request)
{
if (!request.hasField("sourceName") || !request.hasField("track") || !request.hasField("active")) {
return request.failed("missing request parameters");
}
QString sourceName = obs_data_get_string(request.parameters(), "sourceName");
bool active = obs_data_get_bool(request.parameters(), "active");
int track = obs_data_get_int(request.parameters(), "track")-1;
if (sourceName.isEmpty() || track > 5 || track < 0) {
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");
}
uint32_t mixers = obs_source_get_audio_mixers(source);
if (active && !(mixers & (1 << track)))
mixers |= (1 << track);
else if (mixers & (1 << track))
mixers &= ~(1 << track);
obs_source_set_audio_mixers(source, mixers);
return request.success();
}
/**
* Gets whether an audio track is active for a source.
*
* @param {String} `sourceName` Source name.
*
* @return {boolean} `track1`
* @return {boolean} `track2`
* @return {boolean} `track3`
* @return {boolean} `track4`
* @return {boolean} `track5`
* @return {boolean} `track6`
*
* @api requests
* @name GetTracks
* @category sources
* @since unreleased
*/
RpcResponse WSRequestHandler::GetAudioTracks(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");
}
uint32_t mixers = obs_source_get_audio_mixers(source);
OBSDataAutoRelease response = obs_data_create();
obs_data_set_string(response, "name", obs_source_get_name(source));
obs_data_set_bool(response, "track1", mixers & (1 << 0));
obs_data_set_bool(response, "track2", mixers & (1 << 1));
obs_data_set_bool(response, "track3", mixers & (1 << 2));
obs_data_set_bool(response, "track4", mixers & (1 << 3));
obs_data_set_bool(response, "track5", mixers & (1 << 4));
obs_data_set_bool(response, "track6", mixers & (1 << 5));
return request.success(response);
}
/**
* Get the mute status of a specified source.
*