# HG changeset patch # User Chris Cannam # Date 1486139001 0 # Node ID 3eb00e5c76c4e161348f93965480186a87aec54c # Parent 150cfa0c71e12b9bdc4d578a31641e035e493dfb Pull step & block size out into framing struct, return in config Update the C++ code to separate out the framing parameters (step and block size) from the configuration structure into their own structure, as in the latest schema, and to return the accepted framing params in the configuration response. This also implies that the plugin stub (which adapts Piper API back to Vamp) makes a note of the returned values, making them available via its own getPreferredStep/BlockSize so that the host can retry the initialise call in the case where it failed for having the wrong values first time. diff -r 150cfa0c71e1 -r 3eb00e5c76c4 Makefile --- a/Makefile Fri Feb 03 13:00:42 2017 +0000 +++ b/Makefile Fri Feb 03 16:23:21 2017 +0000 @@ -24,9 +24,14 @@ bin/piper-vamp-simple-server: o/simple-server.o o/json11.o o/piper.capnp.o c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) -o/piper.capnp.o: vamp-capnp/piper.capnp.c++ vamp-capnp/piper.capnp.h +o/piper.capnp.o: vamp-capnp/piper.capnp.c++ c++ $(CXXFLAGS) $(INCFLAGS) -c $< -o $@ +vamp-capnp/piper.capnp.h: vamp-capnp/piper.capnp.c++ + +vamp-capnp/piper.capnp.c++: $(PIPER_DIR)/capnp/piper.capnp + capnpc --src-prefix=$(PIPER_DIR)/capnp -oc++:vamp-capnp $< + o/json11.o: ext/json11/json11.cpp c++ $(CXXFLAGS) -c $< -o $@ diff -r 150cfa0c71e1 -r 3eb00e5c76c4 test.sh --- a/test.sh Fri Feb 03 13:00:42 2017 +0000 +++ b/test.sh Fri Feb 03 16:23:21 2017 +0000 @@ -11,7 +11,7 @@ echo echo "Building and running test client..." -( cd "$mypath"/vamp-client/qt && qmake && make && +( cd "$mypath"/vamp-client/qt && qmake && make clean all test && ./test ../../bin/piper-vamp-simple-server ) echo diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-capnp/VampnProto.h --- a/vamp-capnp/VampnProto.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-capnp/VampnProto.h Fri Feb 03 16:23:21 2017 +0000 @@ -477,8 +477,10 @@ b.setCurrentProgram(c.currentProgram); b.setChannelCount(c.channelCount); - b.setStepSize(c.stepSize); - b.setBlockSize(c.blockSize); + + auto framing = b.initFraming(); + framing.setStepSize(c.framing.stepSize); + framing.setBlockSize(c.framing.blockSize); } static void @@ -492,8 +494,8 @@ c.currentProgram = r.getCurrentProgram(); c.channelCount = r.getChannelCount(); - c.stepSize = r.getStepSize(); - c.blockSize = r.getBlockSize(); + c.framing.stepSize = r.getFraming().getStepSize(); + c.framing.blockSize = r.getFraming().getBlockSize(); } static void @@ -642,6 +644,9 @@ auto od = olist[i]; buildOutputDescriptor(od, cr.outputs[i]); } + auto framing = b.initFraming(); + framing.setStepSize(cr.framing.stepSize); + framing.setBlockSize(cr.framing.blockSize); } static void @@ -657,6 +662,8 @@ readOutputDescriptor(desc, o); cr.outputs.push_back(desc); } + cr.framing.stepSize = r.getFraming().getStepSize(); + cr.framing.blockSize = r.getFraming().getBlockSize(); } static void diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-capnp/piper.capnp.c++ --- a/vamp-capnp/piper.capnp.c++ Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-capnp/piper.capnp.c++ Fri Feb 03 16:23:21 2017 +0000 @@ -1238,17 +1238,77 @@ 1, 2, i_ab2572c346316b24, nullptr, nullptr, { &s_ab2572c346316b24, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<105> b_db209a01f86fe045 = { +static const ::capnp::_::AlignedData<49> b_fe907ebf410a65a4 = { + { 0, 0, 0, 0, 5, 0, 6, 0, + 164, 101, 10, 65, 191, 126, 144, 254, + 12, 0, 0, 0, 1, 0, 1, 0, + 6, 146, 153, 76, 196, 198, 177, 196, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 162, 0, 0, 0, + 29, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 112, 105, 112, 101, 114, 46, 99, 97, + 112, 110, 112, 58, 70, 114, 97, 109, + 105, 110, 103, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, + 8, 0, 0, 0, 3, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 41, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 3, 0, 1, 0, + 52, 0, 0, 0, 2, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 0, 3, 0, 1, 0, + 60, 0, 0, 0, 2, 0, 1, 0, + 115, 116, 101, 112, 83, 105, 122, 101, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 98, 108, 111, 99, 107, 83, 105, 122, + 101, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, } +}; +::capnp::word const* const bp_fe907ebf410a65a4 = b_fe907ebf410a65a4.words; +#if !CAPNP_LITE +static const uint16_t m_fe907ebf410a65a4[] = {1, 0}; +static const uint16_t i_fe907ebf410a65a4[] = {0, 1}; +const ::capnp::_::RawSchema s_fe907ebf410a65a4 = { + 0xfe907ebf410a65a4, b_fe907ebf410a65a4.words, 49, nullptr, m_fe907ebf410a65a4, + 0, 2, i_fe907ebf410a65a4, nullptr, nullptr, { &s_fe907ebf410a65a4, nullptr, nullptr, 0, 0, nullptr } +}; +#endif // !CAPNP_LITE +static const ::capnp::_::AlignedData<88> b_db209a01f86fe045 = { { 0, 0, 0, 0, 5, 0, 6, 0, 69, 224, 111, 248, 1, 154, 32, 219, - 12, 0, 0, 0, 1, 0, 2, 0, + 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, - 2, 0, 7, 0, 0, 0, 0, 0, + 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 210, 0, 0, 0, 33, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 0, 0, 0, 31, 1, 0, 0, + 41, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, @@ -1259,42 +1319,35 @@ 55, 221, 34, 212, 254, 86, 11, 144, 1, 0, 0, 0, 58, 0, 0, 0, 80, 86, 80, 97, 105, 114, 0, 0, - 20, 0, 0, 0, 3, 0, 4, 0, + 16, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125, 0, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 124, 0, 0, 0, 3, 0, 1, 0, - 152, 0, 0, 0, 2, 0, 1, 0, + 97, 0, 0, 0, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 3, 0, 1, 0, + 124, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 0, 0, 0, 122, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 3, 0, 1, 0, - 160, 0, 0, 0, 2, 0, 1, 0, + 121, 0, 0, 0, 122, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 120, 0, 0, 0, 3, 0, 1, 0, + 132, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 157, 0, 0, 0, 106, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 156, 0, 0, 0, 3, 0, 1, 0, - 168, 0, 0, 0, 2, 0, 1, 0, - 3, 0, 0, 0, 1, 0, 0, 0, + 129, 0, 0, 0, 106, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 3, 0, 1, 0, + 140, 0, 0, 0, 2, 0, 1, 0, + 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 165, 0, 0, 0, 74, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 164, 0, 0, 0, 3, 0, 1, 0, - 176, 0, 0, 0, 2, 0, 1, 0, - 4, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 173, 0, 0, 0, 82, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 172, 0, 0, 0, 3, 0, 1, 0, - 184, 0, 0, 0, 2, 0, 1, 0, + 137, 0, 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 132, 0, 0, 0, 3, 0, 1, 0, + 144, 0, 0, 0, 2, 0, 1, 0, 112, 97, 114, 97, 109, 101, 116, 101, 114, 86, 97, 108, 117, 101, 115, 0, 14, 0, 0, 0, 0, 0, 0, 0, @@ -1326,22 +1379,12 @@ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 115, 116, 101, 112, 83, 105, 122, 101, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 98, 108, 111, 99, 107, 83, 105, 122, - 101, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, + 102, 114, 97, 109, 105, 110, 103, 0, + 16, 0, 0, 0, 0, 0, 0, 0, + 164, 101, 10, 65, 191, 126, 144, 254, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; @@ -1349,12 +1392,13 @@ #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_db209a01f86fe045[] = { &s_900b56fed422dd37, + &s_fe907ebf410a65a4, }; -static const uint16_t m_db209a01f86fe045[] = {4, 2, 1, 0, 3}; -static const uint16_t i_db209a01f86fe045[] = {0, 1, 2, 3, 4}; +static const uint16_t m_db209a01f86fe045[] = {2, 1, 3, 0}; +static const uint16_t i_db209a01f86fe045[] = {0, 1, 2, 3}; const ::capnp::_::RawSchema s_db209a01f86fe045 = { - 0xdb209a01f86fe045, b_db209a01f86fe045.words, 105, d_db209a01f86fe045, m_db209a01f86fe045, - 1, 5, i_db209a01f86fe045, nullptr, nullptr, { &s_db209a01f86fe045, nullptr, nullptr, 0, 0, nullptr } + 0xdb209a01f86fe045, b_db209a01f86fe045.words, 88, d_db209a01f86fe045, m_db209a01f86fe045, + 2, 4, i_db209a01f86fe045, nullptr, nullptr, { &s_db209a01f86fe045, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<50> b_900b56fed422dd37 = { @@ -1864,17 +1908,17 @@ 1, 2, i_fcf72b478bbe9d02, nullptr, nullptr, { &s_fcf72b478bbe9d02, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<53> b_c433db5864bf6d56 = { +static const ::capnp::_::AlignedData<68> b_c433db5864bf6d56 = { { 0, 0, 0, 0, 5, 0, 6, 0, 86, 109, 191, 100, 88, 219, 51, 196, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, - 1, 0, 7, 0, 0, 0, 0, 0, + 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 18, 1, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 119, 0, 0, 0, + 33, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, @@ -1883,21 +1927,28 @@ 110, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 8, 0, 0, 0, 3, 0, 4, 0, + 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 0, 0, 0, 58, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 3, 0, 1, 0, - 48, 0, 0, 0, 2, 0, 1, 0, + 69, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 3, 0, 1, 0, + 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 0, 0, 0, 66, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 40, 0, 0, 0, 3, 0, 1, 0, - 68, 0, 0, 0, 2, 0, 1, 0, + 73, 0, 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 0, 3, 0, 1, 0, + 96, 0, 0, 0, 2, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 93, 0, 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 88, 0, 0, 0, 3, 0, 1, 0, + 100, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1917,18 +1968,27 @@ 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 102, 114, 97, 109, 105, 110, 103, 0, + 16, 0, 0, 0, 0, 0, 0, 0, + 164, 101, 10, 65, 191, 126, 144, 254, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_c433db5864bf6d56 = b_c433db5864bf6d56.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_c433db5864bf6d56[] = { &s_902c6065e1be824a, + &s_fe907ebf410a65a4, }; -static const uint16_t m_c433db5864bf6d56[] = {0, 1}; -static const uint16_t i_c433db5864bf6d56[] = {0, 1}; +static const uint16_t m_c433db5864bf6d56[] = {2, 0, 1}; +static const uint16_t i_c433db5864bf6d56[] = {0, 1, 2}; const ::capnp::_::RawSchema s_c433db5864bf6d56 = { - 0xc433db5864bf6d56, b_c433db5864bf6d56.words, 53, d_c433db5864bf6d56, m_c433db5864bf6d56, - 1, 2, i_c433db5864bf6d56, nullptr, nullptr, { &s_c433db5864bf6d56, nullptr, nullptr, 0, 0, nullptr } + 0xc433db5864bf6d56, b_c433db5864bf6d56.words, 68, d_c433db5864bf6d56, m_c433db5864bf6d56, + 2, 3, i_c433db5864bf6d56, nullptr, nullptr, { &s_c433db5864bf6d56, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_ea87c8bff474ddce = { @@ -2829,6 +2889,17 @@ constexpr ::capnp::_::RawBrandedSchema const* FeatureSet::FSPair::_capnpPrivate::brand; #endif // !CAPNP_LITE +// Framing +#ifndef _MSC_VER +constexpr uint16_t Framing::_capnpPrivate::dataWordSize; +constexpr uint16_t Framing::_capnpPrivate::pointerCount; +#endif +#if !CAPNP_LITE +constexpr ::capnp::Kind Framing::_capnpPrivate::kind; +constexpr ::capnp::_::RawSchema const* Framing::_capnpPrivate::schema; +constexpr ::capnp::_::RawBrandedSchema const* Framing::_capnpPrivate::brand; +#endif // !CAPNP_LITE + // Configuration #ifndef _MSC_VER constexpr uint16_t Configuration::_capnpPrivate::dataWordSize; diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-capnp/piper.capnp.h --- a/vamp-capnp/piper.capnp.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-capnp/piper.capnp.h Fri Feb 03 16:23:21 2017 +0000 @@ -37,6 +37,7 @@ CAPNP_DECLARE_SCHEMA(d6a172208c9a1760); CAPNP_DECLARE_SCHEMA(ffa3fccceb684869); CAPNP_DECLARE_SCHEMA(ab2572c346316b24); +CAPNP_DECLARE_SCHEMA(fe907ebf410a65a4); CAPNP_DECLARE_SCHEMA(db209a01f86fe045); CAPNP_DECLARE_SCHEMA(900b56fed422dd37); CAPNP_DECLARE_SCHEMA(b5edf73eb2e79c4e); @@ -226,6 +227,21 @@ }; }; +struct Framing { + Framing() = delete; + + class Reader; + class Builder; + class Pipeline; + + struct _capnpPrivate { + CAPNP_DECLARE_STRUCT_HEADER(fe907ebf410a65a4, 1, 0) + #if !CAPNP_LITE + static constexpr ::capnp::_::RawBrandedSchema const* brand = &schema->defaultBrand; + #endif // !CAPNP_LITE + }; +}; + struct Configuration { Configuration() = delete; @@ -235,7 +251,7 @@ struct PVPair; struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(db209a01f86fe045, 2, 2) + CAPNP_DECLARE_STRUCT_HEADER(db209a01f86fe045, 1, 3) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand = &schema->defaultBrand; #endif // !CAPNP_LITE @@ -344,7 +360,7 @@ class Pipeline; struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(c433db5864bf6d56, 1, 1) + CAPNP_DECLARE_STRUCT_HEADER(c433db5864bf6d56, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand = &schema->defaultBrand; #endif // !CAPNP_LITE @@ -1655,9 +1671,9 @@ }; #endif // !CAPNP_LITE -class Configuration::Reader { +class Framing::Reader { public: - typedef Configuration Reads; + typedef Framing Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} @@ -1672,14 +1688,6 @@ } #endif // !CAPNP_LITE - inline bool hasParameterValues() const; - inline ::capnp::List< ::piper::Configuration::PVPair>::Reader getParameterValues() const; - - inline bool hasCurrentProgram() const; - inline ::capnp::Text::Reader getCurrentProgram() const; - - inline ::int32_t getChannelCount() const; - inline ::int32_t getStepSize() const; inline ::int32_t getBlockSize() const; @@ -1696,9 +1704,9 @@ friend class ::capnp::Orphanage; }; -class Configuration::Builder { +class Framing::Builder { public: - typedef Configuration Builds; + typedef Framing Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. @@ -1712,6 +1720,94 @@ inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE + inline ::int32_t getStepSize(); + inline void setStepSize( ::int32_t value); + + inline ::int32_t getBlockSize(); + inline void setBlockSize( ::int32_t value); + +private: + ::capnp::_::StructBuilder _builder; + template + friend struct ::capnp::ToDynamic_; + friend class ::capnp::Orphanage; + template + friend struct ::capnp::_::PointerHelpers; +}; + +#if !CAPNP_LITE +class Framing::Pipeline { +public: + typedef Framing Pipelines; + + inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} + inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) + : _typeless(kj::mv(typeless)) {} + +private: + ::capnp::AnyPointer::Pipeline _typeless; + friend class ::capnp::PipelineHook; + template + friend struct ::capnp::ToDynamic_; +}; +#endif // !CAPNP_LITE + +class Configuration::Reader { +public: + typedef Configuration Reads; + + Reader() = default; + inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} + + inline ::capnp::MessageSize totalSize() const { + return _reader.totalSize().asPublic(); + } + +#if !CAPNP_LITE + inline ::kj::StringTree toString() const { + return ::capnp::_::structString(_reader, *_capnpPrivate::brand); + } +#endif // !CAPNP_LITE + + inline bool hasParameterValues() const; + inline ::capnp::List< ::piper::Configuration::PVPair>::Reader getParameterValues() const; + + inline bool hasCurrentProgram() const; + inline ::capnp::Text::Reader getCurrentProgram() const; + + inline ::int32_t getChannelCount() const; + + inline bool hasFraming() const; + inline ::piper::Framing::Reader getFraming() const; + +private: + ::capnp::_::StructReader _reader; + template + friend struct ::capnp::ToDynamic_; + template + friend struct ::capnp::_::PointerHelpers; + template + friend struct ::capnp::List; + friend class ::capnp::MessageBuilder; + friend class ::capnp::Orphanage; +}; + +class Configuration::Builder { +public: + typedef Configuration Builds; + + Builder() = delete; // Deleted to discourage incorrect usage. + // You can explicitly initialize to nullptr instead. + inline Builder(decltype(nullptr)) {} + inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} + inline operator Reader() const { return Reader(_builder.asReader()); } + inline Reader asReader() const { return *this; } + + inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } +#if !CAPNP_LITE + inline ::kj::StringTree toString() const { return asReader().toString(); } +#endif // !CAPNP_LITE + inline bool hasParameterValues(); inline ::capnp::List< ::piper::Configuration::PVPair>::Builder getParameterValues(); inline void setParameterValues( ::capnp::List< ::piper::Configuration::PVPair>::Reader value); @@ -1729,11 +1825,12 @@ inline ::int32_t getChannelCount(); inline void setChannelCount( ::int32_t value); - inline ::int32_t getStepSize(); - inline void setStepSize( ::int32_t value); - - inline ::int32_t getBlockSize(); - inline void setBlockSize( ::int32_t value); + inline bool hasFraming(); + inline ::piper::Framing::Builder getFraming(); + inline void setFraming( ::piper::Framing::Reader value); + inline ::piper::Framing::Builder initFraming(); + inline void adoptFraming(::capnp::Orphan< ::piper::Framing>&& value); + inline ::capnp::Orphan< ::piper::Framing> disownFraming(); private: ::capnp::_::StructBuilder _builder; @@ -1753,6 +1850,7 @@ inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} + inline ::piper::Framing::Pipeline getFraming(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; @@ -2314,6 +2412,9 @@ inline bool hasOutputs() const; inline ::capnp::List< ::piper::OutputDescriptor>::Reader getOutputs() const; + inline bool hasFraming() const; + inline ::piper::Framing::Reader getFraming() const; + private: ::capnp::_::StructReader _reader; template @@ -2352,6 +2453,13 @@ inline void adoptOutputs(::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>> disownOutputs(); + inline bool hasFraming(); + inline ::piper::Framing::Builder getFraming(); + inline void setFraming( ::piper::Framing::Reader value); + inline ::piper::Framing::Builder initFraming(); + inline void adoptFraming(::capnp::Orphan< ::piper::Framing>&& value); + inline ::capnp::Orphan< ::piper::Framing> disownFraming(); + private: ::capnp::_::StructBuilder _builder; template @@ -2370,6 +2478,7 @@ inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} + inline ::piper::Framing::Pipeline getFraming(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; @@ -4698,6 +4807,34 @@ _builder.getPointerField(1 * ::capnp::POINTERS)); } +inline ::int32_t Framing::Reader::getStepSize() const { + return _reader.getDataField< ::int32_t>( + 0 * ::capnp::ELEMENTS); +} + +inline ::int32_t Framing::Builder::getStepSize() { + return _builder.getDataField< ::int32_t>( + 0 * ::capnp::ELEMENTS); +} +inline void Framing::Builder::setStepSize( ::int32_t value) { + _builder.setDataField< ::int32_t>( + 0 * ::capnp::ELEMENTS, value); +} + +inline ::int32_t Framing::Reader::getBlockSize() const { + return _reader.getDataField< ::int32_t>( + 1 * ::capnp::ELEMENTS); +} + +inline ::int32_t Framing::Builder::getBlockSize() { + return _builder.getDataField< ::int32_t>( + 1 * ::capnp::ELEMENTS); +} +inline void Framing::Builder::setBlockSize( ::int32_t value) { + _builder.setDataField< ::int32_t>( + 1 * ::capnp::ELEMENTS, value); +} + inline bool Configuration::Reader::hasParameterValues() const { return !_reader.getPointerField(0 * ::capnp::POINTERS).isNull(); } @@ -4776,32 +4913,41 @@ 0 * ::capnp::ELEMENTS, value); } -inline ::int32_t Configuration::Reader::getStepSize() const { - return _reader.getDataField< ::int32_t>( - 1 * ::capnp::ELEMENTS); -} - -inline ::int32_t Configuration::Builder::getStepSize() { - return _builder.getDataField< ::int32_t>( - 1 * ::capnp::ELEMENTS); -} -inline void Configuration::Builder::setStepSize( ::int32_t value) { - _builder.setDataField< ::int32_t>( - 1 * ::capnp::ELEMENTS, value); -} - -inline ::int32_t Configuration::Reader::getBlockSize() const { - return _reader.getDataField< ::int32_t>( - 2 * ::capnp::ELEMENTS); -} - -inline ::int32_t Configuration::Builder::getBlockSize() { - return _builder.getDataField< ::int32_t>( - 2 * ::capnp::ELEMENTS); -} -inline void Configuration::Builder::setBlockSize( ::int32_t value) { - _builder.setDataField< ::int32_t>( - 2 * ::capnp::ELEMENTS, value); +inline bool Configuration::Reader::hasFraming() const { + return !_reader.getPointerField(2 * ::capnp::POINTERS).isNull(); +} +inline bool Configuration::Builder::hasFraming() { + return !_builder.getPointerField(2 * ::capnp::POINTERS).isNull(); +} +inline ::piper::Framing::Reader Configuration::Reader::getFraming() const { + return ::capnp::_::PointerHelpers< ::piper::Framing>::get( + _reader.getPointerField(2 * ::capnp::POINTERS)); +} +inline ::piper::Framing::Builder Configuration::Builder::getFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::get( + _builder.getPointerField(2 * ::capnp::POINTERS)); +} +#if !CAPNP_LITE +inline ::piper::Framing::Pipeline Configuration::Pipeline::getFraming() { + return ::piper::Framing::Pipeline(_typeless.getPointerField(2)); +} +#endif // !CAPNP_LITE +inline void Configuration::Builder::setFraming( ::piper::Framing::Reader value) { + ::capnp::_::PointerHelpers< ::piper::Framing>::set( + _builder.getPointerField(2 * ::capnp::POINTERS), value); +} +inline ::piper::Framing::Builder Configuration::Builder::initFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::init( + _builder.getPointerField(2 * ::capnp::POINTERS)); +} +inline void Configuration::Builder::adoptFraming( + ::capnp::Orphan< ::piper::Framing>&& value) { + ::capnp::_::PointerHelpers< ::piper::Framing>::adopt( + _builder.getPointerField(2 * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::piper::Framing> Configuration::Builder::disownFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::disown( + _builder.getPointerField(2 * ::capnp::POINTERS)); } inline bool Configuration::PVPair::Reader::hasParameter() const { @@ -5185,6 +5331,43 @@ _builder.getPointerField(0 * ::capnp::POINTERS)); } +inline bool ConfigurationResponse::Reader::hasFraming() const { + return !_reader.getPointerField(1 * ::capnp::POINTERS).isNull(); +} +inline bool ConfigurationResponse::Builder::hasFraming() { + return !_builder.getPointerField(1 * ::capnp::POINTERS).isNull(); +} +inline ::piper::Framing::Reader ConfigurationResponse::Reader::getFraming() const { + return ::capnp::_::PointerHelpers< ::piper::Framing>::get( + _reader.getPointerField(1 * ::capnp::POINTERS)); +} +inline ::piper::Framing::Builder ConfigurationResponse::Builder::getFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::get( + _builder.getPointerField(1 * ::capnp::POINTERS)); +} +#if !CAPNP_LITE +inline ::piper::Framing::Pipeline ConfigurationResponse::Pipeline::getFraming() { + return ::piper::Framing::Pipeline(_typeless.getPointerField(1)); +} +#endif // !CAPNP_LITE +inline void ConfigurationResponse::Builder::setFraming( ::piper::Framing::Reader value) { + ::capnp::_::PointerHelpers< ::piper::Framing>::set( + _builder.getPointerField(1 * ::capnp::POINTERS), value); +} +inline ::piper::Framing::Builder ConfigurationResponse::Builder::initFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::init( + _builder.getPointerField(1 * ::capnp::POINTERS)); +} +inline void ConfigurationResponse::Builder::adoptFraming( + ::capnp::Orphan< ::piper::Framing>&& value) { + ::capnp::_::PointerHelpers< ::piper::Framing>::adopt( + _builder.getPointerField(1 * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::piper::Framing> ConfigurationResponse::Builder::disownFraming() { + return ::capnp::_::PointerHelpers< ::piper::Framing>::disown( + _builder.getPointerField(1 * ::capnp::POINTERS)); +} + inline ::int32_t ProcessRequest::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( 0 * ::capnp::ELEMENTS); diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-client/CapnpRRClient.h --- a/vamp-client/CapnpRRClient.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-client/CapnpRRClient.h Fri Feb 03 16:23:21 2017 +0000 @@ -199,7 +199,7 @@ // PluginClient methods: virtual - Vamp::Plugin::OutputList + ConfigurationResponse configure(PluginStub *plugin, PluginConfiguration config) override { @@ -232,7 +232,7 @@ LOG_E("CapnpRRClient::configure returning"); - return cr.outputs; + return cr; }; virtual diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-client/PluginClient.h --- a/vamp-client/PluginClient.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-client/PluginClient.h Fri Feb 03 16:23:21 2017 +0000 @@ -47,7 +47,7 @@ { public: virtual - Vamp::Plugin::OutputList + ConfigurationResponse configure(PluginStub *plugin, PluginConfiguration config) = 0; diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-client/PluginStub.h --- a/vamp-client/PluginStub.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-client/PluginStub.h Fri Feb 03 16:23:21 2017 +0000 @@ -163,11 +163,21 @@ } m_config.channelCount = int(inputChannels); - m_config.stepSize = int(stepSize); - m_config.blockSize = int(blockSize); + m_config.framing.stepSize = int(stepSize); + m_config.framing.blockSize = int(blockSize); try { - m_outputs = m_client->configure(this, m_config); + auto response = m_client->configure(this, m_config); + m_outputs = response.outputs; + + // Update with the new preferred step and block size now + // that the plugin has taken into account its parameter + // settings. If the values passed in to initialise() + // weren't suitable, then this ensures that a subsequent + // call to getPreferredStepSize/BlockSize on this plugin + // object will at least get acceptable values from now on + m_config.framing = response.framing; + } catch (const std::exception &e) { m_state = Failed; throw; @@ -206,11 +216,17 @@ } virtual size_t getPreferredBlockSize() const { - return m_defaultConfig.blockSize; + // Return this from m_config instead of m_defaultConfig, so + // that it gets updated in the event of an initialise() call + // that fails for the wrong value + return m_config.framing.blockSize; } virtual size_t getPreferredStepSize() const { - return m_defaultConfig.stepSize; + // Return this from m_config instead of m_defaultConfig, so + // that it gets updated in the event of an initialise() call + // that fails for the wrong value + return m_config.framing.stepSize; } virtual size_t getMinChannelCount() const { @@ -265,7 +281,7 @@ for (int c = 0; c < m_config.channelCount; ++c) { vecbuf.push_back(std::vector (inputBuffers[c], - inputBuffers[c] + m_config.blockSize)); + inputBuffers[c] + m_config.framing.blockSize)); } try { diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-json/VampJson.h --- a/vamp-json/VampJson.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-json/VampJson.h Fri Feb 03 16:23:21 2017 +0000 @@ -694,8 +694,11 @@ } jo["channelCount"] = c.channelCount; - jo["stepSize"] = c.stepSize; - jo["blockSize"] = c.blockSize; + + json11::Json::object framing; + framing["stepSize"] = c.framing.stepSize; + framing["blockSize"] = c.framing.blockSize; + jo["framing"] = framing; return json11::Json(jo); } @@ -704,13 +707,18 @@ toPluginConfiguration(json11::Json j, std::string &err) { if (!j.has_shape({ - { "channelCount", json11::Json::NUMBER }, - { "stepSize", json11::Json::NUMBER }, - { "blockSize", json11::Json::NUMBER } }, err)) { + { "channelCount", json11::Json::NUMBER } }, err)) { err = "malformed plugin configuration: " + err; return {}; } + if (!j["framing"].has_shape({ + { "stepSize", json11::Json::NUMBER }, + { "blockSize", json11::Json::NUMBER } }, err)) { + err = "malformed framing: " + err; + return {}; + } + if (!j["parameterValues"].is_null() && !j["parameterValues"].is_object()) { err = "object expected for parameter values"; @@ -733,8 +741,8 @@ PluginConfiguration config; config.channelCount = int(round(j["channelCount"].number_value())); - config.stepSize = int(round(j["stepSize"].number_value())); - config.blockSize = int(round(j["blockSize"].number_value())); + config.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); + config.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); for (auto &pv : j["parameterValues"].object_items()) { config.parameterValues[pv.first] = float(pv.second.number_value()); @@ -963,6 +971,11 @@ outs.push_back(fromOutputDescriptor(d)); } jo["outputList"] = outs; + + json11::Json::object framing; + framing["stepSize"] = cr.framing.stepSize; + framing["blockSize"] = cr.framing.blockSize; + jo["framing"] = framing; return json11::Json(jo); } @@ -973,18 +986,28 @@ ConfigurationResponse cr; - cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); + if (!j["framing"].has_shape({ + { "stepSize", json11::Json::NUMBER }, + { "blockSize", json11::Json::NUMBER } }, err)) { + err = "malformed framing: " + err; + return {}; + } if (!j["outputList"].is_array()) { err = "array expected for output list"; return {}; } + + cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); for (const auto &o: j["outputList"].array_items()) { cr.outputs.push_back(toOutputDescriptor(o, err)); if (failed(err)) return {}; } + cr.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); + cr.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); + return cr; } diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-server/simple-server.cpp --- a/vamp-server/simple-server.cpp Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-server/simple-server.cpp Fri Feb 03 16:23:21 2017 +0000 @@ -484,11 +484,18 @@ throw runtime_error("plugin has already been configured"); } + if (creq.configuration.framing.stepSize == 0 || + creq.configuration.framing.blockSize == 0) { + throw runtime_error("step and block size must be non-zero"); + } + response.configurationResponse = LoaderRequests().configurePlugin(creq); if (!response.configurationResponse.outputs.empty()) { mapper.markConfigured - (h, creq.configuration.channelCount, creq.configuration.blockSize); + (h, + creq.configuration.channelCount, + creq.configuration.framing.blockSize); response.success = true; } break; diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-server/test.sh --- a/vamp-server/test.sh Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-server/test.sh Fri Feb 03 16:23:21 2017 +0000 @@ -64,8 +64,8 @@ {"method":"list","params": {"from":["something-nonexistent"]}} {"method":"load","id":6,"params": {"key":"vamp-example-plugins:percussiononsets","inputSampleRate":44100,"adapterFlags":["AdaptInputDomain","AdaptBufferSize"]}} {"method":"process","params": {"handle": 1, "processInput": { "timestamp": {"s": 0, "n": 0}, "inputBuffers": [ [1,2,3,4,5,6,7,8] ]}}} -{"method":"configure","id":"weevil","params":{"handle":1,"configuration":{"blockSize": 8, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}, "stepSize": 8}}} -{"method":"configure","id":9,"params":{"handle":-9999,"configuration":{"blockSize": 8, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}, "stepSize": 8}}} +{"method":"configure","id":"weevil","params":{"handle":1,"configuration":{"framing":{"blockSize": 8,"stepSize":8}, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}}}} +{"method":"configure","id":9,"params":{"handle":-9999,"configuration":{"framing":{"blockSize": 8,"stepSize":8}, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}}}} {"method":"process","params": {"handle": 1, "processInput": { "timestamp": {"s": 0, "n": 0}, "inputBuffers": [ [1,2,3,4,5,6,7,8] ]}}} {"method":"finish","params": {"handle": 1}} {"method":"finish","id":"blah","params": {"handle": 1}} @@ -74,9 +74,9 @@ # Expected output, apart from the plugin list which seems a bit # fragile to check here cat > "$expected" <initialise(req.configuration.channelCount, - req.configuration.stepSize, - req.configuration.blockSize)) { + req.configuration.framing.stepSize, + req.configuration.framing.blockSize)) { + response.outputs = req.plugin->getOutputDescriptors(); - } + + // If the Vamp plugin initialise() call succeeds, then by + // definition it is accepting the step and block size + // passed in + response.framing = req.configuration.framing; + + } else { + + // If initialise() fails, one reason could be that it + // didn't like the passed-in step and block size. If we + // return its current preferred values here, the + // host/client can retry with these (if they differ) + response.framing.stepSize = req.plugin->getPreferredStepSize(); + response.framing.blockSize = req.plugin->getPreferredBlockSize(); + } return response; } diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-support/PluginConfiguration.h --- a/vamp-support/PluginConfiguration.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-support/PluginConfiguration.h Fri Feb 03 16:23:21 2017 +0000 @@ -45,6 +45,20 @@ namespace piper_vamp { /** + * \struct Framing + * + * A structure bundling the processing step and block size. + */ +struct Framing +{ + Framing() : // invalid by default + stepSize(0), blockSize(0) { } + + int stepSize; + int blockSize; +}; + +/** * \class PluginConfiguration * * PluginConfiguration is a structure bundling together data that @@ -59,11 +73,10 @@ struct PluginConfiguration { PluginConfiguration() : // invalid configuration by default - channelCount(0), stepSize(0), blockSize(0) { } + channelCount(0) { } int channelCount; - int stepSize; - int blockSize; + Framing framing; typedef std::map ParameterMap; ParameterMap parameterValues; std::string currentProgram; @@ -77,8 +90,8 @@ PluginConfiguration c; c.channelCount = channelCount; - c.stepSize = stepSize; - c.blockSize = blockSize; + c.framing.stepSize = stepSize; + c.framing.blockSize = blockSize; Vamp::PluginBase::ParameterList params = p->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = params.begin(); diff -r 150cfa0c71e1 -r 3eb00e5c76c4 vamp-support/RequestResponse.h --- a/vamp-support/RequestResponse.h Fri Feb 03 13:00:42 2017 +0000 +++ b/vamp-support/RequestResponse.h Fri Feb 03 16:23:21 2017 +0000 @@ -187,7 +187,10 @@ * The return value from a configuration request (i.e. setting the * parameters and initialising the plugin). If the configuration was * successful, the output list will contain the final - * post-initialisation output descriptors. If configuration failed, + * post-initialisation output descriptors and the required step and + * block size. (The step and block size will usually match those + * passed to configure, but may differ if the parameter settings + * turned out to be incompatible with those.) If configuration failed, * the output list will be empty. * * \see PluginConfiguration, ConfigurationRequest, LoadRequest, LoadResponse @@ -200,6 +203,7 @@ Vamp::Plugin *plugin; Vamp::Plugin::OutputList outputs; + Framing framing; }; /**