static int cbjack_graph_order_callback(void * arg) { cubeb * ctx = (cubeb *)arg; int i; uint32_t rate; jack_latency_range_t latency_range; jack_nframes_t port_latency, max_latency = 0; for (int j = 0; j < MAX_STREAMS; j++) { cubeb_stream *stm = &ctx->streams[j]; if (!stm->in_use) continue; if (!stm->ports_ready) continue; for (i = 0; i < (int)stm->out_params.channels; ++i) { api_jack_port_get_latency_range(stm->output_ports[i], JackPlaybackLatency, &latency_range); port_latency = latency_range.max; if (port_latency > max_latency) max_latency = port_latency; } /* Cap minimum latency to 128 frames */ if (max_latency < 128) max_latency = 128; } if (cbjack_get_preferred_sample_rate(ctx, &rate) == CUBEB_ERROR) ctx->jack_latency = (max_latency * 1000) / 48000; else ctx->jack_latency = (max_latency * 1000) / rate; return 0; }
static int cbjack_enumerate_devices(cubeb * context, cubeb_device_type type, cubeb_device_collection ** collection) { if (!context) return CUBEB_ERROR; uint32_t rate; uint8_t i = 0; uint8_t j; cbjack_get_preferred_sample_rate(context, &rate); const char * j_in = "JACK capture"; const char * j_out = "JACK playback"; if (type & CUBEB_DEVICE_TYPE_OUTPUT) { context->devinfo[i] = (cubeb_device_info *)malloc(sizeof(cubeb_device_info)); context->devinfo[i]->device_id = strdup(j_out); context->devinfo[i]->devid = context->devinfo[i]->device_id; context->devinfo[i]->friendly_name = strdup(j_out); context->devinfo[i]->group_id = strdup(j_out); context->devinfo[i]->vendor_name = strdup(j_out); context->devinfo[i]->type = CUBEB_DEVICE_TYPE_OUTPUT; context->devinfo[i]->state = CUBEB_DEVICE_STATE_ENABLED; context->devinfo[i]->preferred = CUBEB_DEVICE_PREF_ALL; context->devinfo[i]->format = CUBEB_DEVICE_FMT_F32NE; context->devinfo[i]->default_format = CUBEB_DEVICE_FMT_F32NE; context->devinfo[i]->max_channels = MAX_CHANNELS; context->devinfo[i]->min_rate = rate; context->devinfo[i]->max_rate = rate; context->devinfo[i]->default_rate = rate; context->devinfo[i]->latency_lo_ms = 1; context->devinfo[i]->latency_hi_ms = 10; i++; } if (type & CUBEB_DEVICE_TYPE_INPUT) { context->devinfo[i] = (cubeb_device_info *)malloc(sizeof(cubeb_device_info)); context->devinfo[i]->device_id = strdup(j_in); context->devinfo[i]->devid = context->devinfo[i]->device_id; context->devinfo[i]->friendly_name = strdup(j_in); context->devinfo[i]->group_id = strdup(j_in); context->devinfo[i]->vendor_name = strdup(j_in); context->devinfo[i]->type = CUBEB_DEVICE_TYPE_INPUT; context->devinfo[i]->state = CUBEB_DEVICE_STATE_ENABLED; context->devinfo[i]->preferred = CUBEB_DEVICE_PREF_ALL; context->devinfo[i]->format = CUBEB_DEVICE_FMT_F32NE; context->devinfo[i]->default_format = CUBEB_DEVICE_FMT_F32NE; context->devinfo[i]->max_channels = MAX_CHANNELS; context->devinfo[i]->min_rate = rate; context->devinfo[i]->max_rate = rate; context->devinfo[i]->default_rate = rate; context->devinfo[i]->latency_lo_ms = 1; context->devinfo[i]->latency_hi_ms = 10; i++; } *collection = (cubeb_device_collection *) malloc(sizeof(cubeb_device_collection) + i * sizeof(cubeb_device_info *)); (*collection)->count = i; for (j = 0; j < i; j++) { (*collection)->device[j] = context->devinfo[j]; } return CUBEB_OK; }
static int cbjack_enumerate_devices(cubeb * context, cubeb_device_type type, cubeb_device_collection * collection) { if (!context) return CUBEB_ERROR; uint32_t rate; cbjack_get_preferred_sample_rate(context, &rate); const char * j_in = "JACK capture"; const char * j_out = "JACK playback"; cubeb_device_info * devices = new cubeb_device_info[2]; reinterpret_cast<cubeb_device_info *>(calloc(2, sizeof(cubeb_device_info))); collection->count = 0; if (type & CUBEB_DEVICE_TYPE_OUTPUT) { cubeb_device_info * cur = &devices[collection->count]; cur->device_id = strdup(j_out); cur->devid = (cubeb_devid) cur->device_id; cur->friendly_name = strdup(j_out); cur->group_id = strdup(j_out); cur->vendor_name = strdup(j_out); cur->type = CUBEB_DEVICE_TYPE_OUTPUT; cur->state = CUBEB_DEVICE_STATE_ENABLED; cur->preferred = CUBEB_DEVICE_PREF_ALL; cur->format = CUBEB_DEVICE_FMT_F32NE; cur->default_format = CUBEB_DEVICE_FMT_F32NE; cur->max_channels = MAX_CHANNELS; cur->min_rate = rate; cur->max_rate = rate; cur->default_rate = rate; cur->latency_lo = 0; cur->latency_hi = 0; collection->count +=1 ; } if (type & CUBEB_DEVICE_TYPE_INPUT) { cubeb_device_info * cur = &devices[collection->count]; cur->device_id = strdup(j_in); cur->devid = (cubeb_devid) cur->device_id; cur->friendly_name = strdup(j_in); cur->group_id = strdup(j_in); cur->vendor_name = strdup(j_in); cur->type = CUBEB_DEVICE_TYPE_INPUT; cur->state = CUBEB_DEVICE_STATE_ENABLED; cur->preferred = CUBEB_DEVICE_PREF_ALL; cur->format = CUBEB_DEVICE_FMT_F32NE; cur->default_format = CUBEB_DEVICE_FMT_F32NE; cur->max_channels = MAX_CHANNELS; cur->min_rate = rate; cur->max_rate = rate; cur->default_rate = rate; cur->latency_lo = 0; cur->latency_hi = 0; collection->count += 1; } collection->device = devices; return CUBEB_OK; }