void krad_ipc_server_mixer_broadcast ( krad_ipc_server_t *krad_ipc_server, uint32_t ebml_id, uint32_t ebml_subid, char *portname, char *controlname, float floatval) { int c; uint64_t element; uint64_t subelement; element = 0; subelement = 0; for (c = 0; c < KRAD_IPC_SERVER_MAX_CLIENTS; c++) { if ((krad_ipc_server->clients[c].broadcasts == 1) && (krad_ipc_server->current_client != &krad_ipc_server->clients[c])) { if (krad_ipc_aquire_client (&krad_ipc_server->clients[c])) { krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, ebml_id, &element); krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, ebml_subid, &subelement); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_NAME, portname); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_CONTROL_NAME, controlname); krad_ebml_write_float (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_CONTROL_VALUE, floatval); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, subelement); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, element); krad_ebml_write_sync (krad_ipc_server->clients[c].krad_ebml2); krad_ipc_release_client (&krad_ipc_server->clients[c]); } } } }
void krad_ipc_server_broadcast_tag ( krad_ipc_server_t *krad_ipc_server, char *item, char *name, char *value, int internal) { int c; uint64_t element; uint64_t subelement; element = 0; subelement = 0; for (c = 0; c < KRAD_IPC_SERVER_MAX_CLIENTS; c++) { if ((krad_ipc_server->clients[c].broadcasts == 1) && ((internal) || (krad_ipc_server->current_client != &krad_ipc_server->clients[c]))) { if (krad_ipc_aquire_client (&krad_ipc_server->clients[c])) { krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_MSG, &element); krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_TAG, &subelement); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_TAG_ITEM, item); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_TAG_NAME, name); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_TAG_VALUE, value); //krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_RADIO_TAG_SOURCE, ""); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, subelement); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, element); krad_ebml_write_sync (krad_ipc_server->clients[c].krad_ebml2); krad_ipc_release_client (&krad_ipc_server->clients[c]); } } } }
void krad_ipc_server_response_add_tag ( krad_ipc_server_t *krad_ipc_server, char *tag_item, char *tag_name, char *tag_value) { uint64_t tag; krad_ebml_start_element (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_TAG, &tag); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_TAG_ITEM, tag_item); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_TAG_NAME, tag_name); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_TAG_VALUE, tag_value); //krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_TAG_SOURCE, ""); krad_ebml_finish_element (krad_ipc_server->current_client->krad_ebml2, tag); }
void krad_ipc_server_advanced_string_broadcast ( krad_ipc_server_t *krad_ipc_server, uint32_t ebml_id, uint32_t ebml_subid, uint32_t ebml_subid2, int num, uint32_t ebml_subid3, char *string) { int c; uint64_t element; uint64_t subelement; element = 0; subelement = 0; for (c = 0; c < KRAD_IPC_SERVER_MAX_CLIENTS; c++) { if ((krad_ipc_server->clients[c].broadcasts == 1) && (krad_ipc_server->current_client != &krad_ipc_server->clients[c])) { if (krad_ipc_aquire_client (&krad_ipc_server->clients[c])) { krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, ebml_id, &element); krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, ebml_subid, &subelement); krad_ebml_write_int32 (krad_ipc_server->clients[c].krad_ebml2, ebml_subid2, num); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, ebml_subid3, string); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, subelement); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, element); krad_ebml_write_sync (krad_ipc_server->clients[c].krad_ebml2); krad_ipc_release_client (&krad_ipc_server->clients[c]); } } } }
void krad_ipc_server_broadcast_portgroup_created ( krad_ipc_server_t *krad_ipc_server, char *name, int channels, int io_type, float volume, char *mixbus, int xmms2 ) { int c; uint64_t portgroup; uint64_t element; uint64_t subelement; for (c = 0; c < KRAD_IPC_SERVER_MAX_CLIENTS; c++) { if ((krad_ipc_server->clients[c].broadcasts == 1) && (krad_ipc_server->current_client != &krad_ipc_server->clients[c])) { //if (krad_ipc_server->clients[c].broadcasts == 1) { if (krad_ipc_aquire_client (&krad_ipc_server->clients[c])) { krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_MSG, &element); krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CREATED, &subelement); krad_ebml_start_element (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP, &portgroup); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_NAME, name); krad_ebml_write_int8 (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CHANNELS, channels); if (io_type == 0) { krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Jack"); } else { krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Internal"); } krad_ebml_write_float (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_VOLUME, volume); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_MIXBUS, mixbus); krad_ebml_write_string (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE_NAME, ""); krad_ebml_write_float (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE, 0.0); krad_ebml_write_int8 (krad_ipc_server->clients[c].krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_XMMS2, xmms2); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, portgroup); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, subelement); krad_ebml_finish_element (krad_ipc_server->clients[c].krad_ebml2, element); krad_ebml_write_sync (krad_ipc_server->clients[c].krad_ebml2); krad_ipc_release_client (&krad_ipc_server->clients[c]); } } } }
static void krad_mixer_portgroup_rep_to_ebml (kr_portgroup_t *portgroup_rep, krad_ebml_t *krad_ebml) { //uint64_t portgroup; int i; //krad_ebml_start_element (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP, &portgroup); krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_NAME, portgroup_rep->sysname); krad_ebml_write_int8 (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_CHANNELS, portgroup_rep->channels); krad_ebml_write_int8 (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_CHANNELS, portgroup_rep->direction); krad_ebml_write_int8 (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_CHANNELS, portgroup_rep->output_type); if (portgroup_rep->io_type == 0) { krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Jack"); } else { krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Internal"); } for (i = 0; i < portgroup_rep->channels; i++) { krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_VOLUME, portgroup_rep->volume[i]); } for (i = 0; i < portgroup_rep->channels; i++) { krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_VOLUME, portgroup_rep->peak[i]); } for (i = 0; i < portgroup_rep->channels; i++) { krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_VOLUME, portgroup_rep->rms[i]); } krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_MIXBUS, portgroup_rep->mixbus); krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE_NAME, portgroup_rep->crossfade_group); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE, portgroup_rep->fade); krad_ebml_write_int8 (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_XMMS2, portgroup_rep->has_xmms2); if (portgroup_rep->has_xmms2 == 1) { krad_ebml_write_string (krad_ebml, EBML_ID_KRAD_MIXER_PORTGROUP_XMMS2, portgroup_rep->xmms2_ipc_path); } /* for (i = 0; i < KRAD_EQ_MAX_BANDS; i++) { krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, krad_mixer_portgroup_rep->eq.band[i].db); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, krad_mixer_portgroup_rep->eq.band[i].bandwidth); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, krad_mixer_portgroup_rep->eq.band[i].hz); // ("NOW hz is %f %f\n", krad_mixer_portgroup_rep->eq.band[i].hz); } */ krad_ebml_write_data (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, &portgroup_rep->eq, sizeof(kr_eq_rep_t)); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->lowpass.hz); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->lowpass.bandwidth); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->highpass.hz); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->highpass.bandwidth); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->analog.drive); krad_ebml_write_float (krad_ebml, EBML_ID_KRAD_EFFECT_CONTROL, portgroup_rep->analog.blend); //krad_ebml_finish_element (krad_ebml, portgroup); }
void krad_ipc_server_response_add_portgroup ( krad_ipc_server_t *krad_ipc_server, char *name, int channels, int io_type, float volume, char *mixbus, char *crossfade_name, float crossfade_value, int xmms2) { uint64_t portgroup; krad_ebml_start_element (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP, &portgroup); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_NAME, name); krad_ebml_write_int8 (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CHANNELS, channels); if (io_type == 0) { krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Jack"); } else { krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_TYPE, "Internal"); } krad_ebml_write_float (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_VOLUME, volume); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_MIXBUS, mixbus); krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE_NAME, crossfade_name); krad_ebml_write_float (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_CROSSFADE, crossfade_value); krad_ebml_write_int8 (krad_ipc_server->current_client->krad_ebml2, EBML_ID_KRAD_MIXER_PORTGROUP_XMMS2, xmms2); krad_ebml_finish_element (krad_ipc_server->current_client->krad_ebml2, portgroup); }
void krad_ipc_server_respond_string ( krad_ipc_server_t *krad_ipc_server, uint32_t ebml_id, char *string) { krad_ebml_write_string (krad_ipc_server->current_client->krad_ebml2, ebml_id, string); }
int krad_transponder_handler ( krad_transponder_t *krad_transponder, krad_ipc_server_t *krad_ipc ) { krad_link_t *krad_link; uint32_t ebml_id; uint32_t command; uint64_t ebml_data_size; kr_address_t address; uint64_t element; uint64_t response; uint64_t payload_loc; char string[256]; uint64_t bigint; //int regint; uint8_t tinyint; int k; int devices; //float floatval; string[0] = '\0'; bigint = 0; k = 0; krad_ipc_server_read_command ( krad_ipc, &command, &ebml_data_size); switch ( command ) { case EBML_ID_KRAD_TRANSPONDER_CMD_LIST_LINKS: //printk ("krad transponder handler! LIST_LINKS"); krad_Xtransponder_list ( krad_transponder->krad_Xtransponder ); krad_ipc_server_response_start ( krad_ipc, EBML_ID_KRAD_TRANSPONDER_MSG, &response); for (k = 0; k < KRAD_TRANSPONDER_MAX_LINKS; k++) { if (krad_transponder->krad_link[k] != NULL) { printk ("Link %d Active: %s", k, krad_transponder->krad_link[k]->mount); krad_transponder_link_to_ebml ( krad_ipc->current_client, krad_transponder->krad_link[k]); } } krad_ipc_server_response_finish ( krad_ipc, response ); break; case EBML_ID_KRAD_TRANSPONDER_CMD_CREATE_LINK: for (k = 0; k < KRAD_TRANSPONDER_MAX_LINKS; k++) { if (krad_transponder->krad_link[k] == NULL) { krad_transponder->krad_link[k] = krad_link_prepare (k); krad_link = krad_transponder->krad_link[k]; krad_link->link_num = k; krad_link->krad_radio = krad_transponder->krad_radio; krad_link->krad_transponder = krad_transponder; krad_transponder_ebml_to_link ( krad_ipc, krad_link ); krad_link_start (krad_link); /* if ((krad_link->operation_mode == TRANSMIT) || (krad_link->operation_mode == RECORD)) { if (krad_link_wait_codec_init (krad_link) == 0) { krad_transponder_broadcast_link_created ( krad_ipc, krad_link ); } } else { krad_transponder_broadcast_link_created ( krad_ipc, krad_link ); } */ break; } } break; case EBML_ID_KRAD_TRANSPONDER_CMD_DESTROY_LINK: tinyint = krad_ipc_server_read_number (krad_ipc, ebml_data_size); k = tinyint; //printk ("krad transponder handler! DESTROY_LINK: %d %u", k, tinyint); if (krad_transponder->krad_link[k] != NULL) { krad_link_destroy (krad_transponder->krad_link[k]); krad_transponder->krad_link[k] = NULL; } /* krad_ipc_server_simple_number_broadcast ( krad_ipc, EBML_ID_KRAD_TRANSPONDER_MSG, EBML_ID_KRAD_TRANSPONDER_LINK_DESTROYED, EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER, k); */ break; case EBML_ID_KRAD_TRANSPONDER_CMD_UPDATE_LINK: //printk ("krad transponder handler! UPDATE_LINK"); krad_ebml_read_element (krad_ipc->current_client->krad_ebml, &ebml_id, &ebml_data_size); if (ebml_id == EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER) { tinyint = krad_ipc_server_read_number (krad_ipc, ebml_data_size); k = tinyint; //printk ("krad transponder handler! UPDATE_LINK: %d %u", k, tinyint); if (krad_transponder->krad_link[k] != NULL) { krad_ebml_read_element (krad_ipc->current_client->krad_ebml, &ebml_id, &ebml_data_size); if (krad_transponder->krad_link[k]->audio_codec == OPUS) { /* if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_APPLICATION) { krad_ebml_read_string (krad_ipc->current_client->krad_ebml, string, ebml_data_size); if (strncmp(string, "OPUS_APPLICATION_VOIP", 21) == 0) { krad_opus_set_application (krad_transponder->krad_link[k]->krad_opus, OPUS_APPLICATION_VOIP); } if (strncmp(string, "OPUS_APPLICATION_AUDIO", 22) == 0) { krad_opus_set_application (krad_transponder->krad_link[k]->krad_opus, OPUS_APPLICATION_AUDIO); } if (strncmp(string, "OPUS_APPLICATION_RESTRICTED_LOWDELAY", 36) == 0) { krad_opus_set_application (krad_transponder->krad_link[k]->krad_opus, OPUS_APPLICATION_RESTRICTED_LOWDELAY); } } */ if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_SIGNAL) { krad_ebml_read_string (krad_ipc->current_client->krad_ebml, string, ebml_data_size); krad_opus_set_signal (krad_transponder->krad_link[k]->krad_opus, krad_opus_string_to_signal(string)); } if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_BANDWIDTH) { krad_ebml_read_string (krad_ipc->current_client->krad_ebml, string, ebml_data_size); krad_opus_set_bandwidth (krad_transponder->krad_link[k]->krad_opus, krad_opus_string_to_bandwidth(string)); } if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_BITRATE) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if ((bigint >= 500) && (bigint <= 512000)) { krad_opus_set_bitrate (krad_transponder->krad_link[k]->krad_opus, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_COMPLEXITY) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if ((bigint >= 0) && (bigint <= 10)) { krad_opus_set_complexity (krad_transponder->krad_link[k]->krad_opus, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_FRAME_SIZE) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if ((bigint == 120) || (bigint == 240) || (bigint == 480) || (bigint == 960) || (bigint == 1920) || (bigint == 2880)) { krad_opus_set_frame_size (krad_transponder->krad_link[k]->krad_opus, bigint); } } //FIXME verify ogg container if (ebml_id == EBML_ID_KRAD_LINK_LINK_OGG_MAX_PACKETS_PER_PAGE) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if ((bigint > 0) && (bigint < 200)) { krad_ogg_set_max_packets_per_page (krad_transponder->krad_link[k]->krad_container->krad_ogg, bigint); } } } if (krad_transponder->krad_link[k]->video_codec == THEORA) { if (ebml_id == EBML_ID_KRAD_LINK_LINK_THEORA_QUALITY) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); krad_theora_encoder_quality_set (krad_transponder->krad_link[k]->krad_theora_encoder, bigint); } } if (krad_transponder->krad_link[k]->video_codec == VP8) { if (ebml_id == EBML_ID_KRAD_LINK_LINK_VP8_BITRATE) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if (bigint > 0) { krad_vpx_encoder_bitrate_set (krad_transponder->krad_link[k]->krad_vpx_encoder, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_VP8_MIN_QUANTIZER) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if (bigint > 0) { krad_vpx_encoder_min_quantizer_set (krad_transponder->krad_link[k]->krad_vpx_encoder, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_VP8_MAX_QUANTIZER) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if (bigint > 0) { krad_vpx_encoder_max_quantizer_set (krad_transponder->krad_link[k]->krad_vpx_encoder, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_VP8_DEADLINE) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if (bigint > 0) { krad_vpx_encoder_deadline_set (krad_transponder->krad_link[k]->krad_vpx_encoder, bigint); } } if (ebml_id == EBML_ID_KRAD_LINK_LINK_VP8_FORCE_KEYFRAME) { bigint = krad_ebml_read_number (krad_ipc->current_client->krad_ebml, ebml_data_size); if (bigint > 0) { krad_vpx_encoder_want_keyframe (krad_transponder->krad_link[k]->krad_vpx_encoder); } } } /* if ((ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_BANDWIDTH) || (ebml_id == EBML_ID_KRAD_LINK_LINK_OPUS_SIGNAL)) { krad_ipc_server_advanced_string_broadcast ( krad_ipc, EBML_ID_KRAD_TRANSPONDER_MSG, EBML_ID_KRAD_TRANSPONDER_LINK_UPDATED, EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER, k, ebml_id, string); } else { krad_ipc_server_advanced_number_broadcast ( krad_ipc, EBML_ID_KRAD_TRANSPONDER_MSG, EBML_ID_KRAD_TRANSPONDER_LINK_UPDATED, EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER, k, ebml_id, bigint); } */ } } break; case EBML_ID_KRAD_TRANSPONDER_CMD_LIST_ADAPTERS: address.path.unit = KR_TRANSPONDER; address.path.subunit.transponder_subunit = KR_ADAPTER; #ifdef KR_LINUX devices = krad_v4l2_detect_devices (); for (k = 0; k < devices; k++) { if (krad_v4l2_get_device_filename (k, string) > 0) { address.id.number = k; krad_ipc_server_response_start_with_address_and_type ( krad_ipc, &address, EBML_ID_KRAD_SUBUNIT_INFO, &response); krad_ipc_server_payload_start ( krad_ipc, &payload_loc); krad_ebml_write_string (krad_ipc->current_client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_V4L2_DEVICE_FILENAME, string); //krad_ebml_start_element (kr_ipc->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_REMOTE_STATUS, &element); //krad_ipc_server_respond_string ( kr_ipc, EBML_ID_KRAD_RADIO_REMOTE_INTERFACE, kr_ipc->tcp_interface[i]); //krad_ipc_server_respond_number ( kr_ipc, EBML_ID_KRAD_RADIO_REMOTE_PORT, kr_ipc->tcp_port[i]); //krad_ebml_finish_element (kr_ipc->current_client->krad_ebml2, element); krad_ipc_server_payload_finish ( krad_ipc, payload_loc ); krad_ipc_server_response_finish ( krad_ipc, response ); } } #endif devices = krad_decklink_detect_devices(); for (k = 0; k < devices; k++) { krad_decklink_get_device_name (k, string); address.id.number = k; krad_ipc_server_response_start_with_address_and_type ( krad_ipc, &address, EBML_ID_KRAD_SUBUNIT_INFO, &response); krad_ipc_server_payload_start ( krad_ipc, &payload_loc); krad_ebml_write_string (krad_ipc->current_client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_DECKLINK_DEVICE_NAME, string); //krad_ebml_start_element (kr_ipc->current_client->krad_ebml2, EBML_ID_KRAD_RADIO_REMOTE_STATUS, &element); //krad_ipc_server_respond_string ( kr_ipc, EBML_ID_KRAD_RADIO_REMOTE_INTERFACE, kr_ipc->tcp_interface[i]); //krad_ipc_server_respond_number ( kr_ipc, EBML_ID_KRAD_RADIO_REMOTE_PORT, kr_ipc->tcp_port[i]); //krad_ebml_finish_element (kr_ipc->current_client->krad_ebml2, element); krad_ipc_server_payload_finish ( krad_ipc, payload_loc ); krad_ipc_server_response_finish ( krad_ipc, response ); } return 1; case EBML_ID_KRAD_TRANSPONDER_CMD_LISTEN_ENABLE: krad_ebml_read_element ( krad_ipc->current_client->krad_ebml, &ebml_id, &ebml_data_size); if (ebml_id != EBML_ID_KRAD_RADIO_TCP_PORT) { printke ("hrm wtf6"); } bigint = krad_ebml_read_number ( krad_ipc->current_client->krad_ebml, ebml_data_size); krad_receiver_listen_on (krad_transponder->krad_receiver, bigint); break; case EBML_ID_KRAD_TRANSPONDER_CMD_LISTEN_DISABLE: krad_receiver_stop_listening (krad_transponder->krad_receiver); break; case EBML_ID_KRAD_TRANSPONDER_CMD_TRANSMITTER_ENABLE: krad_ebml_read_element ( krad_ipc->current_client->krad_ebml, &ebml_id, &ebml_data_size); if (ebml_id != EBML_ID_KRAD_RADIO_TCP_PORT) { printke ("hrm wtf6"); } bigint = krad_ebml_read_number ( krad_ipc->current_client->krad_ebml, ebml_data_size); krad_transmitter_listen_on (krad_transponder->krad_transmitter, bigint); break; case EBML_ID_KRAD_TRANSPONDER_CMD_TRANSMITTER_DISABLE: krad_transmitter_stop_listening (krad_transponder->krad_transmitter); break; } return 0; }
void krad_transponder_link_to_ebml ( krad_ipc_server_client_t *client, krad_link_t *krad_link) { uint64_t link; krad_ebml_start_element (client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_LINK, &link); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER, krad_link->link_num); switch ( krad_link->av_mode ) { case AUDIO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "audio only"); break; case VIDEO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "video only"); break; case AUDIO_AND_VIDEO: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "audio and video"); break; } switch ( krad_link->operation_mode ) { case TRANSMIT: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "transmit"); break; case RECORD: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "record"); break; case PLAYBACK: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "playback"); break; case RECEIVE: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "receive"); break; case CAPTURE: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "capture"); break; default: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "Other/Unknown"); break; } if (krad_link->operation_mode == RECEIVE) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); if ((krad_link->transport_mode == UDP) || (krad_link->transport_mode == TCP)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); } } if (krad_link->operation_mode == CAPTURE) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_SOURCE, krad_link_video_source_to_string (krad_link->video_source)); } if (krad_link->operation_mode == PLAYBACK) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); if (krad_link->transport_mode == FILESYSTEM) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FILENAME, krad_link->input); } if (krad_link->transport_mode == TCP) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_HOST, krad_link->host); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_MOUNT, krad_link->mount); } } if ((krad_link->operation_mode == TRANSMIT) || (krad_link->operation_mode == RECORD)) { switch ( krad_link->av_mode ) { case AUDIO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CODEC, krad_codec_to_string (krad_link->audio_codec)); break; case VIDEO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_CODEC, krad_codec_to_string (krad_link->video_codec)); break; case AUDIO_AND_VIDEO: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_CODEC, krad_codec_to_string (krad_link->video_codec)); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CODEC, krad_codec_to_string (krad_link->audio_codec)); break; } if (krad_link->operation_mode == TRANSMIT) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_HOST, krad_link->host); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_MOUNT, krad_link->mount); } if (krad_link->operation_mode == RECORD) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FILENAME, krad_link->output); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CHANNELS, 2); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_SAMPLE_RATE, 48000); } if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_WIDTH, krad_link->encoding_width); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_HEIGHT, krad_link->encoding_height); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FPS_NUMERATOR, krad_link->encoding_fps_numerator); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FPS_DENOMINATOR, krad_link->encoding_fps_denominator); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_COLOR_DEPTH, 420); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->audio_codec == VORBIS) { krad_ebml_write_float (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VORBIS_QUALITY, krad_link->krad_vorbis->quality); } if (krad_link->audio_codec == FLAC) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FLAC_BIT_DEPTH, krad_link->krad_flac->bit_depth); } if (krad_link->audio_codec == OPUS) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_SIGNAL, krad_opus_signal_to_string (krad_opus_get_signal (krad_link->krad_opus))); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_BANDWIDTH, krad_opus_bandwidth_to_string (krad_opus_get_bandwidth (krad_link->krad_opus))); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_BITRATE, krad_opus_get_bitrate (krad_link->krad_opus)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_COMPLEXITY, krad_opus_get_complexity (krad_link->krad_opus)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_FRAME_SIZE, krad_opus_get_frame_size (krad_link->krad_opus)); //EBML_ID_KRAD_LINK_LINK_OGG_MAX_PACKETS_PER_PAGE, atoi(argv[5])); } } if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->video_codec == THEORA) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_THEORA_QUALITY, krad_theora_encoder_quality_get (krad_link->krad_theora_encoder)); } if (krad_link->video_codec == VP8) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_BITRATE, krad_vpx_encoder_bitrate_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_MIN_QUANTIZER, krad_vpx_encoder_min_quantizer_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_MAX_QUANTIZER, krad_vpx_encoder_max_quantizer_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_DEADLINE, krad_vpx_encoder_deadline_get (krad_link->krad_vpx_encoder)); } } } krad_ebml_finish_element (client->krad_ebml2, link); }