static void rdpsnd_process_connect(rdpSvcPlugin* plugin) { rdpsndPlugin* rdpsnd = (rdpsndPlugin*) plugin; RDP_PLUGIN_DATA* data; RDP_PLUGIN_DATA default_data[2] = { { 0 }, { 0 } }; DEBUG_SVC("connecting"); plugin->interval_callback = rdpsnd_process_interval; rdpsnd->data_out_list = list_new(); rdpsnd->latency = -1; data = (RDP_PLUGIN_DATA*)plugin->channel_entry_points.pExtendedData; while (data && data->size > 0) { rdpsnd_process_plugin_data(rdpsnd, data); data = (RDP_PLUGIN_DATA*) (((uint8*) data) + data->size); } if (rdpsnd->device == NULL) { default_data[0].size = sizeof(RDP_PLUGIN_DATA); default_data[0].data[0] = "pulse"; default_data[0].data[1] = ""; if (!rdpsnd_load_device_plugin(rdpsnd, "pulse", default_data)) { default_data[0].data[0] = "alsa"; default_data[0].data[1] = "default"; if (!rdpsnd_load_device_plugin(rdpsnd, "alsa", default_data)) { default_data[0].data[0] = "macaudio"; default_data[0].data[1] = "default"; rdpsnd_load_device_plugin(rdpsnd, "macaudio", default_data); } else { printf("rdpsnd: successfully loaded alsa plugin\n"); } } else { printf("rdpsnd: successfully loaded pulseaudio plugin\n"); } } if (rdpsnd->device == NULL) { DEBUG_WARN("no sound device."); } }
static int rdpsnd_process_plugin_data(rdpsndPlugin * plugin, RD_PLUGIN_DATA * data) { if (strcmp((char*)data->data[0], "buffer") == 0) { /* TODO: Set the sound buffer size */ return 0; } else { return rdpsnd_load_device_plugin(plugin, (char*)data->data[0], data); } }
static void rdpsnd_process_plugin_data(rdpsndPlugin* rdpsnd, RDP_PLUGIN_DATA* data) { if (strcmp((char*)data->data[0], "format") == 0) { rdpsnd->fixed_format = atoi(data->data[1]); } else if (strcmp((char*)data->data[0], "rate") == 0) { rdpsnd->fixed_rate = atoi(data->data[1]); } else if (strcmp((char*)data->data[0], "channel") == 0) { rdpsnd->fixed_channel = atoi(data->data[1]); } else if (strcmp((char*)data->data[0], "latency") == 0) { rdpsnd->latency = atoi(data->data[1]); } else { rdpsnd_load_device_plugin(rdpsnd, (char*)data->data[0], data); } }
static int rdpsnd_process_plugin_data(rdpsndPlugin * plugin, RD_PLUGIN_DATA * data) { if (strcmp((char*)data->data[0], "format") == 0) { plugin->fixed_format = atoi(data->data[1]); return 0; } else if (strcmp((char*)data->data[0], "rate") == 0) { plugin->fixed_rate = atoi(data->data[1]); return 0; } else if (strcmp((char*)data->data[0], "channel") == 0) { plugin->fixed_channel = atoi(data->data[1]); return 0; } else { return rdpsnd_load_device_plugin(plugin, (char*)data->data[0], data); } }
/* this registers two channels but only rdpsnd is used */ int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { rdpsndPlugin * plugin; RD_PLUGIN_DATA * data; RD_PLUGIN_DATA default_data[2] = { { 0 }, { 0 } }; LLOGLN(10, ("VirtualChannelEntry:")); plugin = (rdpsndPlugin *) malloc(sizeof(rdpsndPlugin)); memset(plugin, 0, sizeof(rdpsndPlugin)); chan_plugin_init((rdpChanPlugin *) plugin); plugin->data_in_size = 0; plugin->data_in = 0; plugin->ep = *pEntryPoints; memset(&(plugin->channel_def), 0, sizeof(plugin->channel_def)); plugin->channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP; strcpy(plugin->channel_def.name, "rdpsnd"); plugin->in_mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(plugin->in_mutex, 0); plugin->in_list_head = 0; plugin->in_list_tail = 0; plugin->out_list_head = 0; plugin->out_list_tail = 0; plugin->term_event = wait_obj_new("freerdprdpsndterm"); plugin->data_in_event = wait_obj_new("freerdprdpsnddatain"); plugin->expectingWave = 0; plugin->current_format = -1; plugin->thread_status = 0; plugin->ep.pVirtualChannelInit(&plugin->chan_plugin.init_handle, &plugin->channel_def, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, InitEvent); if (pEntryPoints->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_EX)) { data = (RD_PLUGIN_DATA *) (((PCHANNEL_ENTRY_POINTS_EX)pEntryPoints)->pExtendedData); } else { data = NULL; } while (data && data->size > 0) { rdpsnd_process_plugin_data(plugin, data); data = (RD_PLUGIN_DATA *) (((void *) data) + data->size); } if (plugin->device_plugin == NULL) { default_data[0].size = sizeof(RD_PLUGIN_DATA); default_data[0].data[0] = "alsa"; default_data[0].data[1] = "default"; rdpsnd_load_device_plugin(plugin, "alsa", default_data); } if (plugin->device_plugin == NULL) { LLOGLN(0, ("rdpsnd: no sound device.")); } return 1; }