| @@ -7,6 +7,7 @@ | |||||
| * http://www.jackaudio.org | * http://www.jackaudio.org | ||||
| * | * | ||||
| * Copyright (C) 2005-2007 Pieter Palmers | * Copyright (C) 2005-2007 Pieter Palmers | ||||
| * Copyright (C) 2012 Jonathan Woithe | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or modify | * 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 | * 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); | 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 8 | ||||
| #define FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE 9 | |||||
| // enable verbose messages | // enable verbose messages | ||||
| static int g_verbose=0; | static int g_verbose=0; | ||||
| @@ -675,24 +679,71 @@ ffado_driver_stop (ffado_driver_t *driver) | |||||
| static int | static int | ||||
| ffado_driver_bufsize (ffado_driver_t* driver, jack_nframes_t nframes) | 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 = | driver->period_usecs = | ||||
| (jack_time_t) floor ((((float) nframes) / driver->sample_rate) | (jack_time_t) floor ((((float) nframes) / driver->sample_rate) | ||||
| * 1000000.0f); | * 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 */ | /* tell the engine to change its buffer size */ | ||||
| #if 0 | |||||
| if (driver->engine->set_buffer_size (driver->engine, nframes)) { | if (driver->engine->set_buffer_size (driver->engine, nframes)) { | ||||
| jack_error ("FFADO: cannot set engine buffer size to %d (check MIDI)", nframes); | jack_error ("FFADO: cannot set engine buffer size to %d (check MIDI)", nframes); | ||||
| return -1; | 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 *); | typedef void (*JackDriverFinishFunction) (jack_driver_t *); | ||||
| @@ -704,7 +755,7 @@ ffado_driver_new (jack_client_t * client, | |||||
| { | { | ||||
| ffado_driver_t *driver; | 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()); | printError("Incompatible libffado version! (%s)", ffado_get_version()); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||