@@ -204,14 +204,11 @@ namespace impl
204204 };
205205 std::vector<nic_packet_counter> nic_packet_counters;
206206
207- // Example of an audio sender control class
208- static nmos::control_protocol_resource
209- make_sender_control (nmos::experimental::control_protocol_state & control_protocol_state,
210- const web::json::value & sender_data,
211- const nmos::nc_oid & oid,
212- const nmos::nc_oid & parent_oid,
213- const web::json::value touchpoint,
214- slog::base_gate & gate) {
207+
208+ // Example of audio sender control class descriptors. Used below for setting up a sender control class
209+ nmos::nc_class_id
210+ make_audio_sender_descriptors (nmos::experimental::control_protocol_state & control_protocol_state,
211+ const web::json::value & sender_data) {
215212 using web::json::value;
216213 using web::json::value_of;
217214
@@ -238,21 +235,21 @@ namespace impl
238235 auto ret = nmos::nc::details::make_datatype_descriptor_struct (descriptor, type_name, fields, value::null ());
239236 return ret;
240237 };
241-
242- std::vector<std::tuple<utility::string_t ,utility::string_t ,utility::string_t >> subs_array{
238+ std::vector<std::tuple<utility::string_t ,utility::string_t ,utility::string_t >> subs_array {
243239 {U (" active" ), U (" active" ), U (" NcBoolean" )},
244- {U (" receiver_id" ), U (" receiver_id" ), U (" NcUuid" )}};
240+ {U (" receiver_id" ), U (" receiver_id" ), U (" NcUuid" )}
241+ };
245242 auto subs_data_type = make_object_object_datatype (subs_array, U (" NcSenderObjectType" ), U (" NcSenderObjectType" ));
246- control_protocol_state.insert (nmos::experimental::datatype_descriptor{ subs_data_type });
243+ control_protocol_state.insert (std::move ( nmos::experimental::datatype_descriptor{ subs_data_type }) );
247244
248245 auto caps_data_type = make_object_array_datatype (U (" Media Type Array" ), U (" media_types" ), U (" NcSenderCapsType" ), U (" NcSenderCapsType" ));
249- control_protocol_state.insert (nmos::experimental::datatype_descriptor{ caps_data_type });
246+ control_protocol_state.insert (std::move ( nmos::experimental::datatype_descriptor{ caps_data_type }) );
250247
251248 auto tags_data_type = make_object_array_datatype (U (" Hints Type Array" ), U (" urn:x-nmos:tag:grouphint/v1.0" ), U (" NcSenderTagsType" ), U (" NcSenderTagsType" ));
252- control_protocol_state.insert (nmos::experimental::datatype_descriptor{ tags_data_type });
249+ control_protocol_state.insert (std::move ( nmos::experimental::datatype_descriptor{ tags_data_type }) );
253250
254251 auto array_data_type = nmos::nc::details::make_datatype_typedef (U (" Array Type" ), U (" NcArray" ), true , U (" NcString" ), value::null ());
255- control_protocol_state.insert (nmos::experimental::datatype_descriptor{ array_data_type });
252+ control_protocol_state.insert (std::move ( nmos::experimental::datatype_descriptor{ array_data_type }) );
256253
257254 const web::json::field_as_value caps_property{ U (" caps" ) };
258255 const web::json::field_as_string description_property{ U (" description" ) };
@@ -269,34 +266,61 @@ namespace impl
269266
270267 // Define property descriptors: required fields
271268 std::vector<web::json::value> snd_control_property_descriptors = {
272- nmos::experimental::make_control_class_property_descriptor (description_property , { 3 , 1 }, description_property, U (" NcString" )),
273- nmos::experimental::make_control_class_property_descriptor (uuid_property , { 3 , 2 }, uuid_property, U (" NcUuid" )),
274- nmos::experimental::make_control_class_property_descriptor (label_property , { 3 , 3 }, label_property, U (" NcString" )),
275- nmos::experimental::make_control_class_property_descriptor (tags_property , { 3 , 4 }, tags_property, U (" NcSenderTagsType" )),
276- nmos::experimental::make_control_class_property_descriptor (version_property , { 3 , 5 }, version_property, U (" NcVersionCode" )),
269+ nmos::experimental::make_control_class_property_descriptor (U ( " description " ) , { 3 , 1 }, description_property, U (" NcString" )),
270+ nmos::experimental::make_control_class_property_descriptor (U ( " resource_id " ) , { 3 , 2 }, uuid_property, U (" NcUuid" )),
271+ nmos::experimental::make_control_class_property_descriptor (U ( " label " ) , { 3 , 3 }, label_property, U (" NcString" )),
272+ nmos::experimental::make_control_class_property_descriptor (U ( " tags " ) , { 3 , 4 }, tags_property, U (" NcSenderTagsType" )),
273+ nmos::experimental::make_control_class_property_descriptor (U ( " version " ) , { 3 , 5 }, version_property, U (" NcVersionCode" )),
277274 };
278275 // Property descriptor for optional fields
279- if (sender_data.has_field (caps_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (caps_property ,{ 3 , 6 }, caps_property, U (" NcSenderCapsType" )));
280- if (sender_data.has_field (device_id_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (device_id_property , { 3 , 7 }, device_id_property, U (" NcUuid" )));
281- if (sender_data.has_field (flow_id_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (flow_id_property , { 3 , 8 }, flow_id_property, U (" NcUuid" )));
282- if (sender_data.has_field (interface_bindings_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (interface_bindings_property , { 3 , 9 }, interface_bindings_property, U (" NcArray" )));
283- if (sender_data.has_field (manifest_href_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (manifest_href_property , { 3 , 10 }, manifest_href_property, U (" NcUri" )));
284- if (sender_data.has_field (subscription_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (subscription_property , { 3 , 11 }, subscription_property, U (" NcSenderObjectType" )));
285- if (sender_data.has_field (transport_property)) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (transport_property , { 3 , 12 }, transport_property, U (" NcString" )));
276+ if (sender_data.has_field (U ( " caps " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " caps " ) ,{ 3 , 6 }, caps_property, U (" NcSenderCapsType" )));
277+ if (sender_data.has_field (U ( " device_id " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " description " ) , { 3 , 7 }, device_id_property, U (" NcUuid" )));
278+ if (sender_data.has_field (U ( " flow_id " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " flow_id " ) , { 3 , 8 }, flow_id_property, U (" NcUuid" )));
279+ if (sender_data.has_field (U ( " interface_bindings " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " interface_bindings " ) , { 3 , 9 }, interface_bindings_property, U (" NcArray" )));
280+ if (sender_data.has_field (U ( " manifest_href " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " manifest_href " ) , { 3 , 10 }, manifest_href_property, U (" NcUri" )));
281+ if (sender_data.has_field (U ( " subscription " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " subscription " ) , { 3 , 11 }, subscription_property, U (" NcSenderObjectType" )));
282+ if (sender_data.has_field (U ( " transport " ))) snd_control_property_descriptors.push_back (nmos::experimental::make_control_class_property_descriptor (U ( " transport " ) , { 3 , 12 }, transport_property, U (" NcString" )));
286283
287- auto snd_class_id = nmos::nc::make_class_id (nmos::nc_worker_class_id, 0 , { 4 });
284+ auto snd_class_id = nmos::nc::make_class_id (nmos::nc_worker_class_id, 0 , { 5 });
288285
289286 // method and event descriptors are defined by defaults in the function prototype, so only need to pass the property descriptors
290- utility::string_t descriptor_description = sender_data. at (label_property). as_string ()+ U (" control class descriptor" );
287+ utility::string_t descriptor_description = utility::string_t ( U ( " AudioSenderControl " )) + utility::string_t ( U (" control class descriptor" ) );
291288 auto sender_control_class_descriptor =
292- nmos::experimental::make_control_class_descriptor (descriptor_description, // U("Sender control class descriptor"),
293- snd_class_id, U (" SenderControl " ),
294- snd_control_property_descriptors /* ,snd_control_method_descriptors */ );
289+ nmos::experimental::make_control_class_descriptor (descriptor_description,
290+ snd_class_id, U (" AudioSenderControl " ),
291+ snd_control_property_descriptors);
295292
296293 // Insert class descriptor into the nmos-cpp framework
297294 control_protocol_state.insert (std::move (sender_control_class_descriptor));
298295
299- auto snd_name = U (" audio-sender-control" );
296+ return snd_class_id;
297+ }
298+
299+ // Example of an audio sender control class
300+ static nmos::control_protocol_resource
301+ make_audio_sender_control (const nmos::nc_class_id & snd_class_id,
302+ const web::json::value & sender_data,
303+ const nmos::nc_oid & oid,
304+ const nmos::nc_oid & parent_oid,
305+ const web::json::value touchpoint,
306+ slog::base_gate & gate) {
307+ using web::json::value;
308+ using web::json::value_of;
309+
310+ const web::json::field_as_value caps_property{ U (" caps" ) };
311+ const web::json::field_as_string description_property{ U (" description" ) };
312+ const web::json::field_as_string device_id_property{ U (" device_id" ) };
313+ const web::json::field_as_string flow_id_property{ U (" flow_id" ) };
314+ const web::json::field_as_string uuid_property{ U (" resource_id" ) };
315+ const web::json::field_as_array interface_bindings_property{ U (" interface_bindings" ) };
316+ const web::json::field_as_string label_property{ U (" label" ) };
317+ const web::json::field_as_string manifest_href_property{ U (" manifest_href" ) };
318+ const web::json::field_as_array subscription_property{ U (" subscription" ) };
319+ const web::json::field_as_value tags_property{ U (" tags" ) };
320+ const web::json::field_as_string transport_property{ U (" transport" ) };
321+ const web::json::field<nmos::tai> version_property{ U (" version" ) };
322+
323+ auto snd_name = U (" AudioSenderControl" );
300324 // define a function for instantiating object instances of the class
301325 auto data = nmos::nc::details::make_worker (snd_class_id, oid,
302326 true ,
@@ -309,19 +333,19 @@ namespace impl
309333 true );
310334
311335 // Required
312- data[description_property] = sender_data.at (description_property );
336+ data[description_property] = sender_data.at (U ( " description " ) );
313337 data[uuid_property] = sender_data.at (U (" id" ));
314- data[label_property] = sender_data.at (label_property );
315- data[tags_property] = sender_data.at (tags_property );
316- data[version_property] = sender_data.at (version_property );
338+ data[label_property] = sender_data.at (U ( " label " ) );
339+ data[tags_property] = sender_data.at (U ( " tags " ) );
340+ data[version_property] = sender_data.at (U ( " version " ) );
317341 // Optional
318- if (sender_data.has_field (caps_property)) data[caps_property] = sender_data.at (caps_property );
319- if (sender_data.has_field (device_id_property)) data[device_id_property] = sender_data.at (device_id_property );
320- if (sender_data.has_field (flow_id_property)) data[flow_id_property] = sender_data.at (flow_id_property );
321- if (sender_data.has_field (interface_bindings_property)) data[interface_bindings_property] = sender_data.at (interface_bindings_property );
322- if (sender_data.has_field (manifest_href_property)) data[manifest_href_property] = sender_data.at (manifest_href_property );
323- if (sender_data.has_field (subscription_property)) data[subscription_property] = sender_data.at (subscription_property );
324- if (sender_data.has_field (transport_property)) data[transport_property] = sender_data.at (transport_property );
342+ if (sender_data.has_field (U ( " caps " ))) data[caps_property] = sender_data.at (U ( " caps " ) );
343+ if (sender_data.has_field (U ( " device_id " ))) data[device_id_property] = sender_data.at (U ( " device_id " ) );
344+ if (sender_data.has_field (U ( " flow_id " ))) data[flow_id_property] = sender_data.at (U ( " flow_id " ) );
345+ if (sender_data.has_field (U ( " interface_bindings " ))) data[interface_bindings_property] = sender_data.at (U ( " interface_bindings " ) );
346+ if (sender_data.has_field (U ( " manifest_href " ))) data[manifest_href_property] = sender_data.at (U ( " manifest_href " ) );
347+ if (sender_data.has_field (U ( " subscription " ))) data[subscription_property] = sender_data.at (U ( " subscription " ) );
348+ if (sender_data.has_field (U ( " transport " ))) data[transport_property] = sender_data.at (U ( " transport " ) );
325349
326350 auto snd_control_resource = nmos::control_protocol_resource{ nmos::is12_versions::v1_0, nmos::types::nc_worker, std::move (data), true };
327351 return snd_control_resource;
@@ -1340,6 +1364,9 @@ void node_implementation_init(nmos::node_model& model, nmos::experimental::contr
13401364 return nmos::control_protocol_resource{ nmos::is12_versions::v1_0, nmos::types::nc_worker, std::move (data), true };
13411365 };
13421366
1367+ // audio sender control descriptors
1368+ auto audio_sender_class_id = impl::make_audio_sender_descriptors (control_protocol_state, audio_sender_for_control_protocol);
1369+
13431370 // example root block
13441371 auto root_block = nmos::make_root_block ();
13451372
@@ -1354,6 +1381,13 @@ void node_implementation_init(nmos::node_model& model, nmos::experimental::contr
13541381 // example bulk properties manager
13551382 auto bulk_properties_manager = nmos::make_bulk_properties_manager (++oid);
13561383
1384+ // example sender control
1385+ auto sender_control_block = impl::make_audio_sender_control (audio_sender_class_id,
1386+ audio_sender_for_control_protocol,
1387+ ++oid, nmos::root_block_oid,
1388+ value_of ({ { nmos::nc::details::make_touchpoint_nmos ({nmos::ncp_touchpoint_resource_types::sender, audio_sender_for_control_protocol.at (U (" id" )).as_string ()}) } }),
1389+ gate);
1390+
13571391 // example stereo gain
13581392 const auto stereo_gain_oid = ++oid;
13591393 auto stereo_gain = nmos::make_block (stereo_gain_oid, nmos::root_block_oid, U (" stereo-gain" ), U (" Stereo gain" ), U (" Stereo gain block" ));
0 commit comments