Skip to content

Commit 30473e5

Browse files
authored
Refactor audio sender control class and descriptors
1 parent e1eb367 commit 30473e5

File tree

1 file changed

+78
-44
lines changed

1 file changed

+78
-44
lines changed

Development/nmos-cpp-node/node_implementation.cpp

Lines changed: 78 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)