Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
0
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;
}