diff --git a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/CMakeLists.txt b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/CMakeLists.txt index fe71e958..843afb93 100644 --- a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/CMakeLists.txt +++ b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/CMakeLists.txt @@ -21,6 +21,7 @@ set(LOCAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/CjvxSpNMixChainEnterLeave_output.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/CjvxSpNMixChainEnterLeave_config.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CjvxSpNMixChainEnterLeave_props.cpp ) set(LOCAL_LIBS diff --git a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/codeGen/exports_node.pcg b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/codeGen/exports_node.pcg index 2a3099d1..fad53afc 100644 --- a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/codeGen/exports_node.pcg +++ b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/codeGen/exports_node.pcg @@ -44,4 +44,53 @@ SECTION PROPERTIES ASSOCIATE_EXTERNAL = "yes"; }; }; + + SECTION sources_channel_routing + { + GENERATE_ENTRIES_CONFIG_FILE = "no"; // Defaults to "no" if not present + ALLOWED_STATE_MASK = {"JVX_STATE_SELECTED", "JVX_STATE_ACTIVE", "JVX_STATE_PREPARED", "JVX_STATE_PROCESSING"}; + CALLBACKS = {"specify_one_definition", "remove_one_definition"}; + + SECTION one_new_entry + { + TYPE = "JVX_DATAFORMAT_STRING"; + CALLBACK_SET_POSTHOOK = "specify_one_definition"; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_FULL_READ_AND_WRITE"; + }; + SECTION all_definitions + { + TYPE = "JVX_DATAFORMAT_SELECTION_LIST"; + CONTENT_DECODER_TYPE = "JVX_PROPERTY_DECODER_SINGLE_SELECTION"; + ONLY_SELECTION_TO_CONFIG = "yes"; + SELECTION_LIST_NAMES = {"to-be-filled"}; + SELECTION_LIST_SELECTED = {"yes"}; + SELECTION_LIST_EXCLUSIVE = {"yes"}; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_READ_AND_WRITE_CONTENT"; + }; + SECTION remove_entry + { + TYPE = "JVX_DATAFORMAT_BOOL"; + INIT_SET = 0; + CALLBACK_SET_POSTHOOK = "remove_one_definition"; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_FULL_READ_AND_WRITE"; + }; + SECTION all_offsets + { + TYPE = "JVX_DATAFORMAT_SIZE"; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_FULL_READ_AND_WRITE"; + ASSOCIATE_EXTERNAL = "yes"; + }; + SECTION all_max_chans + { + TYPE = "JVX_DATAFORMAT_SIZE"; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_FULL_READ_AND_WRITE"; + ASSOCIATE_EXTERNAL = "yes"; + }; + SECTION last_error + { + TYPE = "JVX_DATAFORMAT_STRING"; + INIT_SET = ""; + READ_WRITE_ACCESS = "JVX_PROPERTY_ACCESS_READ_ONLY"; + }; + }; }; \ No newline at end of file diff --git a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.cpp b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.cpp index 5e4f83d5..6376a77c 100644 --- a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.cpp +++ b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.cpp @@ -33,7 +33,13 @@ CjvxSpNMixChainEnterLeave::select(IjvxObject* owner) genMixChain::allocate__config(); genMixChain::register__config(this); - genMixChain::register_callbacks(this, set_on_config, this); + genMixChain::init__sources_channel_routing(); + genMixChain::allocate__sources_channel_routing(); + genMixChain::register__sources_channel_routing(this); + + genMixChain::sources_channel_routing.all_definitions.value.entries.clear(); + + genMixChain::register_callbacks(this, set_on_config, specify_one_definition, remove_one_definition, this); operationMode = genMixChain::translate__config__operation_mode_from(); } @@ -47,7 +53,11 @@ CjvxSpNMixChainEnterLeave::unselect() if (res == JVX_NO_ERROR) { genMixChain::unregister_callbacks(this); - genMixChain::unregister__config(this); + + genMixChain::unregister__sources_channel_routing(this); + genMixChain::deallocate__sources_channel_routing(); + + genMixChain::unregister__config(this); genMixChain::deallocate__config(); CjvxBareNode1ioRearrange::unselect(); @@ -68,6 +78,8 @@ CjvxSpNMixChainEnterLeave::activate() _update_property_access_type(JVX_PROPERTY_ACCESS_READ_ONLY, genMixChain::config.number_channels_side); _update_property_access_type(JVX_PROPERTY_ACCESS_READ_ONLY, genMixChain::config.operation_mode); + offset_channels_to_property(); + switch (operationMode) { case jvxOperationModeMixChain::JVX_OPERTION_MODE_MIX_CHAIN_INPUT: @@ -487,43 +499,6 @@ CjvxSpNMixChainEnterLeave::process_buffers_icon(jvxSize mt_mask, jvxSize idx_sta return res; } -JVX_PROPERTIES_FORWARD_C_CALLBACK_EXECUTE_FULL(CjvxSpNMixChainEnterLeave, set_on_config) -{ - jvxBool triggerTest = false; - if (JVX_PROPERTY_CHECK_ID_CAT_SIMPLE(genMixChain::config.number_channels_side)) - { - // New number of channels, run the test function - triggerTest = true; - } - if (JVX_PROPERTY_CHECK_ID_CAT_SIMPLE(genMixChain::config.operation_mode)) - { - operationMode = genMixChain::translate__config__operation_mode_from(); - triggerTest = true; - } - - if (JVX_PROPERTY_CHECK_ID_CAT_SIMPLE(genMixChain::config.channel_routing)) - { - // Correct channel order - correct_order_channel_route(ptrChannelRoutes, szChannelRoutes); - - // Update channel routings - if (szChannelRoutes) - { - memcpy(oldRouting.data(), ptrChannelRoutes, szChannelRoutes * sizeof(jvxSize)); - } - - operationMode = genMixChain::translate__config__operation_mode_from(); - triggerTest = true; - } - - if (triggerTest) - { - this->inform_chain_test(); - } - - return JVX_NO_ERROR; -} - void CjvxSpNMixChainEnterLeave::correct_order_channel_route(jvxSize* ptrChannelRoutes, jvxSize szChannelRoutes) { @@ -667,12 +642,14 @@ CjvxSpNMixChainEnterLeave::return_hidden_interface(jvxInterfaceType tp, jvxHandl return CjvxBareNode1ioRearrange::return_hidden_interface(tp, hdl); } + bool CjvxSpNMixChainEnterLeave::check_positive_zero_copy() { return ( (_common_set_ocon.theData_out.con_params.buffersize == node_inout._common_set_node_params_a_1io.buffersize) && (_common_set_ocon.theData_out.con_params.format == node_inout._common_set_node_params_a_1io.format) && - (_common_set_ocon.theData_out.con_params.rate == node_inout._common_set_node_params_a_1io.samplerate));// && - //(_common_set_ocon.theData_out.con_params.number_channels == node_inout._common_set_node_params_a_1io.number_channels)); + (_common_set_ocon.theData_out.con_params.rate == node_inout._common_set_node_params_a_1io.samplerate)); + + // Here is the trick: we accept zero-copy even if the number of channels does not really fit and CORRECT that afterwards!! } diff --git a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.h b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.h index b15c0f9f..a9fde6ff 100644 --- a/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.h +++ b/sources/jvxComponents/jvxSignalProcessingNodes/jvxSpNMixChainEnterLeave/src/CjvxSpNMixChainEnterLeave.h @@ -17,6 +17,8 @@ enum class jvxOperationModeMixChain class chanOffsetAndMaxChans { +public: + jvxComponentIdentification cpId; jvxSize idxOffset = 0; jvxSize channel_num = 2; }; @@ -41,6 +43,8 @@ class CjvxSpNMixChainEnterLeave : public CjvxBareNode1ioRearrange, std::vector oldRouting; + // Add entries via properties: + // , , std::map presets_channel_routing; /* @@ -90,6 +94,8 @@ class CjvxSpNMixChainEnterLeave : public CjvxBareNode1ioRearrange, jvxHandle* sectionWhereToAddAllSubsections)override; JVX_PROPERTIES_FORWARD_C_CALLBACK_DECLARE(set_on_config); + JVX_PROPERTIES_FORWARD_C_CALLBACK_DECLARE(specify_one_definition); + JVX_PROPERTIES_FORWARD_C_CALLBACK_DECLARE(remove_one_definition); jvxErrorType report_selected_connector(CjvxSingleInputConnector* iconn) override; void request_unique_id_start(CjvxSingleInputConnector* iconn, jvxSize* uId) override; @@ -106,6 +112,8 @@ class CjvxSpNMixChainEnterLeave : public CjvxBareNode1ioRearrange, static void correct_order_channel_route(jvxSize* ptrChannelRoutes, jvxSize szChannelRoutes); bool check_positive_zero_copy()override; + + void offset_channels_to_property(); }; // ============================================================================