Browse Source

Support setbufsize in firewire driver

tags/0.124.0
Jonathan Woithe Adrian Knoth 14 years ago
parent
commit
025d3ad4d5
1 changed files with 60 additions and 9 deletions
  1. +60
    -9
      drivers/firewire/ffado_driver.c

+ 60
- 9
drivers/firewire/ffado_driver.c View File

@@ -7,6 +7,7 @@
* http://www.jackaudio.org
*
* Copyright (C) 2005-2007 Pieter Palmers
* Copyright (C) 2012 Jonathan Woithe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -50,7 +51,10 @@

static int ffado_driver_stop (ffado_driver_t *driver);

// Basic functionality requires API version 8. If version 9 or later
// is present the buffers can be resized at runtime.
#define FIREWIRE_REQUIRED_FFADO_API_VERSION 8
#define FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE 9

// enable verbose messages
static int g_verbose=0;
@@ -675,24 +679,71 @@ ffado_driver_stop (ffado_driver_t *driver)
static int
ffado_driver_bufsize (ffado_driver_t* driver, jack_nframes_t nframes)
{
printError("Buffer size change requested but not supported!!!");
signed int chn;

// The speed of this function isn't critical; we can afford the
// time to check the FFADO API version.
if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE ||
ffado_streaming_set_period_size == NULL) {
printError("unsupported on current version of FFADO; please upgrade FFADO");
return -1;
}

/*
driver->period_size = nframes;
driver->period_size = nframes;
driver->period_usecs =
(jack_time_t) floor ((((float) nframes) / driver->sample_rate)
* 1000000.0f);
*/

// Reallocate the null and scratch buffers.
driver->nullbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
if(driver->nullbuffer == NULL) {
printError("could not allocate memory for null buffer");
return -1;
}
driver->scratchbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
if(driver->scratchbuffer == NULL) {
printError("could not allocate memory for scratch buffer");
return -1;
}

// MIDI buffers need reallocating
for (chn = 0; chn < driver->capture_nchannels; chn++) {
if(driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
// setup the midi buffer
if (driver->capture_channels[chn].midi_buffer != NULL)
free(driver->capture_channels[chn].midi_buffer);
driver->capture_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
}
}
for (chn = 0; chn < driver->playback_nchannels; chn++) {
if(driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
if (driver->playback_channels[chn].midi_buffer != NULL)
free(driver->playback_channels[chn].midi_buffer);
driver->playback_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
}
}

// Notify FFADO of the period size change
if (ffado_streaming_set_period_size(driver->dev, nframes) != 0) {
printError("could not alter FFADO device period size");
return -1;
}

// This is needed to give the shadow variables a chance to
// properly update to the changes.
sleep(1);

/* tell the engine to change its buffer size */
#if 0
if (driver->engine->set_buffer_size (driver->engine, nframes)) {
jack_error ("FFADO: cannot set engine buffer size to %d (check MIDI)", nframes);
return -1;
}
#endif

return -1; // unsupported
// Other drivers (eg: ALSA) don't seem to adjust latencies via
// jack_port_set_latency_range() from the bufsize() callback, so we
// won't either. Is this right?

return 0;
}

typedef void (*JackDriverFinishFunction) (jack_driver_t *);
@@ -704,7 +755,7 @@ ffado_driver_new (jack_client_t * client,
{
ffado_driver_t *driver;

if(ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) {
if(ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION) {
printError("Incompatible libffado version! (%s)", ffado_get_version());
return NULL;
}


Loading…
Cancel
Save