diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 0eec2529..4c474f30 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -121,6 +121,8 @@ const QHash 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 }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 82aa5ee3..d56d57e8 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -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&); diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 35f6e56b..c6e95e6a 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -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. *