From 38c37f2721c3fe954a2fec67eda80bb4e8a3c5f5 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sat, 19 Dec 2020 12:48:18 +0100 Subject: [PATCH] Don't log responses for filtered out requests --- src/common/communication/vst3.h | 17 ++- src/common/logging/vst3.cpp | 210 ++++++++++++++++---------------- src/common/logging/vst3.h | 118 +++++++++--------- 3 files changed, 175 insertions(+), 170 deletions(-) diff --git a/src/common/communication/vst3.h b/src/common/communication/vst3.h index 714a738a..1d9a72f9 100644 --- a/src/common/communication/vst3.h +++ b/src/common/communication/vst3.h @@ -106,9 +106,13 @@ class Vst3MessageHandler : public AdHocSocketHandler { std::optional> logging) { using TResponse = typename T::Response; + // Since a lot of messages just return a `tresult`, we can't filter out + // responses based on the response message type. Instead, we'll just + // only print the responses when the request was not filtered out. + bool should_log_response = false; if (logging) { auto [logger, is_host_vst] = *logging; - logger.log_request(is_host_vst, object); + should_log_response = logger.log_request(is_host_vst, object); } // A socket only handles a single request at a time as to prevent @@ -125,7 +129,7 @@ class Vst3MessageHandler : public AdHocSocketHandler { return std::monostate{}; }); - if (logging) { + if (should_log_response) { auto [logger, is_host_vst] = *logging; logger.log_response(!is_host_vst, response_object); } @@ -165,11 +169,14 @@ class Vst3MessageHandler : public AdHocSocketHandler { const auto process_message = [&](boost::asio::local::stream_protocol::socket& socket) { auto request = read_object(socket); + + // See the comment in `receive_into()` for more information + bool should_log_response = false; if (logging) { - std::visit( + should_log_response = std::visit( [&](const auto& object) { auto [logger, is_host_vst] = *logging; - logger.log_request(is_host_vst, object); + return logger.log_request(is_host_vst, object); }, request); } @@ -181,7 +188,7 @@ class Vst3MessageHandler : public AdHocSocketHandler { [&](T object) { typename T::Response response = callback(object); - if (logging) { + if (should_log_response) { auto [logger, is_host_vst] = *logging; logger.log_response(!is_host_vst, response); } diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 50321f3f..0a3b6610 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -35,9 +35,9 @@ void Vst3Logger::log_unknown_interface( } } -void Vst3Logger::log_request(bool is_host_vst, +bool Vst3Logger::log_request(bool is_host_vst, const Vst3PluginProxy::Construct& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << "IPluginFactory::createComponent(cid = " << format_uid(Steinberg::FUID::fromTUID(request.cid.data())) << ", _iid = "; @@ -53,18 +53,18 @@ void Vst3Logger::log_request(bool is_host_vst, }); } -void Vst3Logger::log_request(bool is_host_vst, +bool Vst3Logger::log_request(bool is_host_vst, const Vst3PluginProxy::Destruct& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { // We don't know what class this instance was originally instantiated // as, but it also doesn't really matter message << request.instance_id << ": FUnknown::~FUnknown()"; }); } -void Vst3Logger::log_request(bool is_host_vst, +bool Vst3Logger::log_request(bool is_host_vst, const Vst3PluginProxy::SetState& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": {IComponent,IEditController}::setState(state = " ")"; }); } -void Vst3Logger::log_request( +bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::SetBusArrangements& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IAudioProcessor::setBusArrangements(inputs = " "[SpeakerArrangement; " @@ -94,20 +94,20 @@ void Vst3Logger::log_request( }); } -void Vst3Logger::log_request( +bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::GetBusArrangement& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IAudioProcessor::getBusArrangement(dir = " << request.dir << ", index = " << request.index << ", &arr)"; }); } -void Vst3Logger::log_request( +bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::CanProcessSampleSize& request) { - log_request_base( + return log_request_base( is_host_vst, Logger::Verbosity::all_events, [&](auto& message) { message << request.instance_id @@ -117,18 +117,18 @@ void Vst3Logger::log_request( }); } -void Vst3Logger::log_request( +bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::GetLatencySamples& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IAudioProcessor::getLatencySamples()"; }); } -void Vst3Logger::log_request(bool is_host_vst, +bool Vst3Logger::log_request(bool is_host_vst, const YaAudioProcessor::SetupProcessing& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IAudioProcessor::setupProcessing(setup = " ")"; }); } -void Vst3Logger::log_request(bool is_host_vst, +bool Vst3Logger::log_request(bool is_host_vst, const YaConnectionPoint::Disconnect& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IConnectionPoint::disconnect(other = )"; }); } -void Vst3Logger::log_request( +bool Vst3Logger::log_request( bool is_host_vst, const YaEditController2::SetComponentState& request) { - log_request_base(is_host_vst, [&](auto& message) { + return log_request_base(is_host_vst, [&](auto& message) { message << request.instance_id << ": IEditController::setComponentState(state = "; }); } @@ -473,44 +473,42 @@ void Vst3Logger::log_response( void Vst3Logger::log_response( bool is_host_vst, const YaAudioProcessor::ProcessResponse& response) { - log_response_base( - is_host_vst, Logger::Verbosity::all_events, [&](auto& message) { - message << response.result.string(); + log_response_base(is_host_vst, [&](auto& message) { + message << response.result.string(); - // This is incredibly verbose, but if you're really a plugin that - // handles processing in a weird way you're going to need all of - // this + // This is incredibly verbose, but if you're really a plugin that + // handles processing in a weird way you're going to need all of this - std::ostringstream num_output_channels; - num_output_channels << "["; - for (bool is_first = true; - const auto& buffers : response.output_data.outputs) { - num_output_channels << (is_first ? "" : ", ") - << buffers.num_channels(); - is_first = false; - } - num_output_channels << "]"; + std::ostringstream num_output_channels; + num_output_channels << "["; + for (bool is_first = true; + const auto& buffers : response.output_data.outputs) { + num_output_channels << (is_first ? "" : ", ") + << buffers.num_channels(); + is_first = false; + } + num_output_channels << "]"; - message << ", "; + message << ", "; - if (response.output_data.output_parameter_changes) { - message << ", num_parameters() - << " parameters>"; - } else { - message << ", host does not support parameter outputs"; - } + if (response.output_data.output_parameter_changes) { + message << ", num_parameters() + << " parameters>"; + } else { + message << ", host does not support parameter outputs"; + } - if (response.output_data.output_events) { - message << ", num_events() - << " events>"; - } else { - message << ", host does not support event outputs"; - } - }); + if (response.output_data.output_events) { + message << ", num_events() + << " events>"; + } else { + message << ", host does not support event outputs"; + } + }); } void Vst3Logger::log_response(bool is_host_vst, diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index b4e07bad..52c476e8 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -55,55 +55,58 @@ class Vst3Logger { // that print information about the request and the response. The boolean // flag here indicates whether the request was initiated on the host side // (what we'll call a control message). + // `log_response()` should only be called if the corresponding + // `log_request()` call returned `true`. This way we can filter out the + // log message for the response together with the request. - void log_request(bool is_host_vst, const Vst3PluginProxy::Construct&); - void log_request(bool is_host_vst, const Vst3PluginProxy::Destruct&); - void log_request(bool is_host_vst, const Vst3PluginProxy::SetState&); - void log_request(bool is_host_vst, const Vst3PluginProxy::GetState&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const Vst3PluginProxy::Construct&); + bool log_request(bool is_host_vst, const Vst3PluginProxy::Destruct&); + bool log_request(bool is_host_vst, const Vst3PluginProxy::SetState&); + bool log_request(bool is_host_vst, const Vst3PluginProxy::GetState&); + bool log_request(bool is_host_vst, const YaAudioProcessor::SetBusArrangements&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaAudioProcessor::GetBusArrangement&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaAudioProcessor::CanProcessSampleSize&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaAudioProcessor::GetLatencySamples&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaAudioProcessor::SetupProcessing&); - void log_request(bool is_host_vst, const YaAudioProcessor::SetProcessing&); - void log_request(bool is_host_vst, const YaAudioProcessor::Process&); - void log_request(bool is_host_vst, const YaAudioProcessor::GetTailSamples&); - void log_request(bool is_host_vst, const YaComponent::SetIoMode&); - void log_request(bool is_host_vst, const YaComponent::GetBusCount&); - void log_request(bool is_host_vst, const YaComponent::GetBusInfo&); - void log_request(bool is_host_vst, const YaComponent::GetRoutingInfo&); - void log_request(bool is_host_vst, const YaComponent::ActivateBus&); - void log_request(bool is_host_vst, const YaComponent::SetActive&); - void log_request(bool is_host_vst, const YaConnectionPoint::Connect&); - void log_request(bool is_host_vst, const YaConnectionPoint::Disconnect&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaAudioProcessor::SetProcessing&); + bool log_request(bool is_host_vst, const YaAudioProcessor::Process&); + bool log_request(bool is_host_vst, const YaAudioProcessor::GetTailSamples&); + bool log_request(bool is_host_vst, const YaComponent::SetIoMode&); + bool log_request(bool is_host_vst, const YaComponent::GetBusCount&); + bool log_request(bool is_host_vst, const YaComponent::GetBusInfo&); + bool log_request(bool is_host_vst, const YaComponent::GetRoutingInfo&); + bool log_request(bool is_host_vst, const YaComponent::ActivateBus&); + bool log_request(bool is_host_vst, const YaComponent::SetActive&); + bool log_request(bool is_host_vst, const YaConnectionPoint::Connect&); + bool log_request(bool is_host_vst, const YaConnectionPoint::Disconnect&); + bool log_request(bool is_host_vst, const YaEditController2::SetComponentState&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::GetParameterCount&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::GetParameterInfo&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::GetParamStringByValue&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::GetParamValueByString&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::NormalizedParamToPlain&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::PlainParamToNormalized&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::GetParamNormalized&); - void log_request(bool is_host_vst, + bool log_request(bool is_host_vst, const YaEditController2::SetParamNormalized&); - void log_request(bool is_host_vst, const YaPluginBase::Initialize&); - void log_request(bool is_host_vst, const YaPluginBase::Terminate&); - void log_request(bool is_host_vst, const YaPluginFactory::Construct&); - void log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); - void log_request(bool is_host_vst, const WantsConfiguration&); + bool log_request(bool is_host_vst, const YaPluginBase::Initialize&); + bool log_request(bool is_host_vst, const YaPluginBase::Terminate&); + bool log_request(bool is_host_vst, const YaPluginFactory::Construct&); + bool log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); + bool log_request(bool is_host_vst, const WantsConfiguration&); void log_response(bool is_host_vst, const Ack&); void log_response( @@ -141,12 +144,11 @@ class Vst3Logger { * Log a request with a standard prefix based on the boolean flag we pass to * every logging function so we don't have to repeat it everywhere. * - * TODO: Make these logging messages return a boolean based on whether or - * not it was filtered out. Don't show the responses for filtered out - * messages. + * Returns `true` if the log message was displayed, and the response should + * thus also be logged. */ template F> - void log_request_base(bool is_host_vst, + bool log_request_base(bool is_host_vst, Logger::Verbosity min_verbosity, F callback) { if (BOOST_UNLIKELY(logger.verbosity >= min_verbosity)) { @@ -159,38 +161,36 @@ class Vst3Logger { callback(message); log(message.str()); + + return true; + } else { + return false; } } template F> - void log_request_base(bool is_host_vst, F callback) { - log_request_base(is_host_vst, Logger::Verbosity::most_events, callback); + bool log_request_base(bool is_host_vst, F callback) { + return log_request_base(is_host_vst, Logger::Verbosity::most_events, + callback); } /** * Log a response with a standard prefix based on the boolean flag we pass * to every logging function so we don't have to repeat it everywhere. + * + * This should only be called when the corresonding `log_request()` returned + * `true`. */ - template F> - void log_response_base(bool is_host_vst, - Logger::Verbosity min_verbosity, - F callback) { - if (BOOST_UNLIKELY(logger.verbosity >= min_verbosity)) { - std::ostringstream message; - if (is_host_vst) { - message << "[host -> vst] "; - } else { - message << "[host <- vst] "; - } - - callback(message); - log(message.str()); - } - } - template F> void log_response_base(bool is_host_vst, F callback) { - log_response_base(is_host_vst, Logger::Verbosity::most_events, - callback); + std::ostringstream message; + if (is_host_vst) { + message << "[host -> vst] "; + } else { + message << "[host <- vst] "; + } + + callback(message); + log(message.str()); } };