From 702f88cea86ce400e4a50663cea5e8a1ca1bab33 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 31 Dec 2021 14:07:59 -0800 Subject: [PATCH] requesthandler: Add GetInputAudioTracks --- src/requesthandler/RequestHandler.cpp | 1 + src/requesthandler/RequestHandler.h | 1 + src/requesthandler/RequestHandler_Inputs.cpp | 71 ++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 27822995..df43364a 100644 --- a/src/requesthandler/RequestHandler.cpp +++ b/src/requesthandler/RequestHandler.cpp @@ -84,6 +84,7 @@ const std::map RequestHandler::_handlerMap {"SetInputAudioSyncOffset", &RequestHandler::SetInputAudioSyncOffset}, {"GetInputAudioMonitorType", &RequestHandler::GetInputAudioMonitorType}, {"SetInputAudioMonitorType", &RequestHandler::SetInputAudioMonitorType}, + {"GetInputAudioTracks", &RequestHandler::GetInputAudioTracks}, {"GetInputPropertiesListPropertyItems", &RequestHandler::GetInputPropertiesListPropertyItems}, {"PressInputPropertiesButton", &RequestHandler::PressInputPropertiesButton}, diff --git a/src/requesthandler/RequestHandler.h b/src/requesthandler/RequestHandler.h index fd11952a..e18bb3ee 100644 --- a/src/requesthandler/RequestHandler.h +++ b/src/requesthandler/RequestHandler.h @@ -106,6 +106,7 @@ class RequestHandler { RequestResult SetInputAudioSyncOffset(const Request&); RequestResult GetInputAudioMonitorType(const Request&); RequestResult SetInputAudioMonitorType(const Request&); + RequestResult GetInputAudioTracks(const Request&); RequestResult GetInputPropertiesListPropertyItems(const Request&); RequestResult PressInputPropertiesButton(const Request&); diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index d7018bc9..75c1d03f 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -346,6 +346,9 @@ RequestResult RequestHandler::GetInputMute(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + json responseData; responseData["inputMuted"] = obs_source_muted(input); return RequestResult::Success(responseData); @@ -372,6 +375,9 @@ RequestResult RequestHandler::SetInputMute(const Request& request) if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment))) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + obs_source_set_muted(input, request.RequestData["inputMuted"]); return RequestResult::Success(); @@ -399,6 +405,9 @@ RequestResult RequestHandler::ToggleInputMute(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + bool inputMuted = !obs_source_muted(input); obs_source_set_muted(input, inputMuted); @@ -430,6 +439,9 @@ RequestResult RequestHandler::GetInputVolume(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + float inputVolumeMul = obs_source_get_volume(input); float inputVolumeDb = obs_mul_to_db(inputVolumeMul); if (inputVolumeDb == -INFINITY) @@ -463,6 +475,9 @@ RequestResult RequestHandler::SetInputVolume(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + bool hasMul = request.Contains("inputVolumeMul"); if (hasMul && !request.ValidateOptionalNumber("inputVolumeMul", statusCode, comment, 0, 20)) return RequestResult::Error(statusCode, comment); @@ -510,6 +525,9 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + json responseData; responseData["inputAudioBalance"] = obs_source_get_balance_value(input); @@ -537,6 +555,9 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request& request) if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0))) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + float inputAudioBalance = request.RequestData["inputAudioBalance"]; obs_source_set_balance_value(input, inputAudioBalance); @@ -567,6 +588,9 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + json responseData; // Offset is stored in nanoseconds in OBS. responseData["inputAudioSyncOffset"] = obs_source_get_sync_offset(input) / 1000000; @@ -595,6 +619,9 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request& request) if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000))) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + int64_t syncOffset = request.RequestData["inputAudioSyncOffset"]; obs_source_set_sync_offset(input, syncOffset * 1000000); @@ -628,6 +655,9 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request& request) if (!input) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + json responseData; responseData["monitorType"] = Utils::Obs::StringHelper::GetInputMonitorType(input); @@ -655,6 +685,9 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request& request) if (!(input && request.ValidateString("monitorType", statusCode, comment))) return RequestResult::Error(statusCode, comment); + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + if (!obs_audio_monitoring_available()) return RequestResult::Error(RequestStatus::InvalidResourceState, "Audio monitoring is not available on this platform."); @@ -674,6 +707,44 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request& request) return RequestResult::Success(); } +/** + * Gets the enable state of all audio tracks of an input. + * + * @requestField inputName | String | Name of the input + * + * @responseField inputAudioTracks | Object | Object of audio tracks and associated enable states + * + * @requestType GetInputAudioTracks + * @complexity 3 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api requests + * @category inputs + */ +RequestResult RequestHandler::GetInputAudioTracks(const Request& request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment); + if (!input) + return RequestResult::Error(statusCode, comment); + + if (!(obs_source_get_output_flags(input) & OBS_SOURCE_AUDIO)) + return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio."); + + long long tracks = obs_source_get_audio_mixers(input); + + json inputAudioTracks; + for (long long i = 0; i < MAX_AUDIO_MIXES; i++) { + inputAudioTracks[std::to_string(i + 1)] = (bool)((tracks >> i) & 1); + } + + json responseData; + responseData["inputAudioTracks"] = inputAudioTracks; + + return RequestResult::Success(responseData); +} + /** * Gets the items of a list property from an input's properties. *