|
|
|
@@ -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; |
|
|
|
} |
|
|
|
|