summaryrefslogtreecommitdiff
path: root/drivers/freebob/freebob_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/freebob/freebob_driver.c')
-rw-r--r--drivers/freebob/freebob_driver.c980
1 files changed, 494 insertions, 486 deletions
diff --git a/drivers/freebob/freebob_driver.c b/drivers/freebob/freebob_driver.c
index 81ab446..d26e6dd 100644
--- a/drivers/freebob/freebob_driver.c
+++ b/drivers/freebob/freebob_driver.c
@@ -22,10 +22,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
+/*
* Main Jack driver entry routines
*
- */
+ */
#include <math.h>
#include <stdio.h>
@@ -49,17 +49,17 @@
#define SAMPLE_MAX_24BIT 8388608.0f
#define SAMPLE_MAX_16BIT 32768.0f
-static int freebob_driver_stop (freebob_driver_t *driver);
+static int freebob_driver_stop(freebob_driver_t *driver);
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver);
- static void freebob_driver_midi_finish (freebob_driver_midi_handle_t *m);
- static int freebob_driver_midi_start (freebob_driver_midi_handle_t *m);
- static int freebob_driver_midi_stop (freebob_driver_midi_handle_t *m);
+static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver);
+static void freebob_driver_midi_finish(freebob_driver_midi_handle_t *m);
+static int freebob_driver_midi_start(freebob_driver_midi_handle_t *m);
+static int freebob_driver_midi_stop(freebob_driver_midi_handle_t *m);
#endif
// enable verbose messages
-static int g_verbose=0;
+static int g_verbose = 0;
static int
freebob_driver_attach (freebob_driver_t *driver)
@@ -68,13 +68,13 @@ freebob_driver_attach (freebob_driver_t *driver)
char buf2[64];
channel_t chn;
- jack_port_t *port=NULL;
+ jack_port_t *port = NULL;
int port_flags;
- int error=0;
+ int error = 0;
jack_latency_range_t range;
- g_verbose=driver->engine->verbose;
- driver->device_options.verbose=g_verbose;
+ g_verbose = driver->engine->verbose;
+ driver->device_options.verbose = g_verbose;
if (driver->engine->set_buffer_size (driver->engine, driver->period_size)) {
jack_error ("FREEBOB: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
@@ -83,63 +83,65 @@ freebob_driver_attach (freebob_driver_t *driver)
driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
/* packetizer thread options */
- driver->device_options.realtime=(driver->engine->control->real_time? 1 : 0);
-
- driver->device_options.packetizer_priority=driver->engine->control->client_priority +
- FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE;
- if (driver->device_options.packetizer_priority>98) {
- driver->device_options.packetizer_priority=98;
+ driver->device_options.realtime = (driver->engine->control->real_time ? 1 : 0);
+
+ driver->device_options.packetizer_priority = driver->engine->control->client_priority +
+ FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE;
+ if (driver->device_options.packetizer_priority > 98) {
+ driver->device_options.packetizer_priority = 98;
}
- driver->dev=freebob_streaming_init(&driver->device_info,driver->device_options);
+ driver->dev = freebob_streaming_init (&driver->device_info, driver->device_options);
- if(!driver->dev) {
- printError("FREEBOB: Error creating virtual device");
+ if (!driver->dev) {
+ printError ("FREEBOB: Error creating virtual device");
return -1;
}
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- driver->midi_handle=freebob_driver_midi_init(driver);
- if(!driver->midi_handle) {
- printError("-----------------------------------------------------------");
- printError("Error creating midi device!");
- printError("FreeBob will run without MIDI support.");
- printError("Consult the above error messages to solve the problem. ");
- printError("-----------------------------------------------------------\n\n");
+ driver->midi_handle = freebob_driver_midi_init (driver);
+ if (!driver->midi_handle) {
+ printError ("-----------------------------------------------------------");
+ printError ("Error creating midi device!");
+ printError ("FreeBob will run without MIDI support.");
+ printError ("Consult the above error messages to solve the problem. ");
+ printError ("-----------------------------------------------------------\n\n");
}
#endif
if (driver->device_options.realtime) {
- printMessage("Streaming thread running with Realtime scheduling, priority %d",
- driver->device_options.packetizer_priority);
+ printMessage ("Streaming thread running with Realtime scheduling, priority %d",
+ driver->device_options.packetizer_priority);
} else {
- printMessage("Streaming thread running without Realtime scheduling");
+ printMessage ("Streaming thread running without Realtime scheduling");
}
/* ports */
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- driver->capture_nchannels=freebob_streaming_get_nb_capture_streams(driver->dev);
+ driver->capture_nchannels = freebob_streaming_get_nb_capture_streams (driver->dev);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
// allocate midi structures
- driver->midi_in_ports=calloc(driver->capture_nchannels, sizeof(freebob_midi_input_port_t));
- if (driver->midi_in_ports == NULL) return -ENOMEM;
+ driver->midi_in_ports = calloc (driver->capture_nchannels, sizeof(freebob_midi_input_port_t));
+ if (driver->midi_in_ports == NULL) {
+ return -ENOMEM;
+ }
#endif
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- error=0;
+ error = 0;
- freebob_streaming_get_capture_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
- switch(freebob_streaming_get_capture_stream_type(driver->dev, chn)) {
+ freebob_streaming_get_capture_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+ switch (freebob_streaming_get_capture_stream_type (driver->dev, chn)) {
case freebob_stream_type_audio:
- snprintf(buf2, 64, "C%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "C%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering audio capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0)) == NULL) {
printError (" cannot register port for %s", buf2);
- error=1;
+ error = 1;
break;
}
driver->capture_ports =
@@ -148,18 +150,18 @@ freebob_driver_attach (freebob_driver_t *driver)
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
case freebob_stream_type_midi:
- snprintf(buf2, 64, "CM%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "CM%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering midi capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
port_flags, 0)) == NULL) {
printError (" cannot register port for %s", buf2);
- error=1;
+ error = 1;
break;
}
// init the midi unpacker for this port
- midi_unpack_init(&driver->midi_in_ports[chn].unpack);
+ midi_unpack_init (&driver->midi_in_ports[chn].unpack);
driver->capture_ports =
jack_slist_append (driver->capture_ports, port);
@@ -174,36 +176,40 @@ freebob_driver_attach (freebob_driver_t *driver)
break;
}
- if(error) break;
+ if (error) {
+ break;
+ }
range.min = range.max = driver->period_size + driver->capture_frame_latency;
jack_port_set_latency_range (port, JackCaptureLatency, &range);
}
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- driver->playback_nchannels=freebob_streaming_get_nb_playback_streams(driver->dev);
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+
+ driver->playback_nchannels = freebob_streaming_get_nb_playback_streams (driver->dev);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
// allocate midi structures
- driver->midi_out_ports=calloc(driver->playback_nchannels, sizeof(freebob_midi_output_port_t));
- if (driver->midi_out_ports == NULL) return -ENOMEM;
+ driver->midi_out_ports = calloc (driver->playback_nchannels, sizeof(freebob_midi_output_port_t));
+ if (driver->midi_out_ports == NULL) {
+ return -ENOMEM;
+ }
#endif
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- error=0;
+ error = 0;
- freebob_streaming_get_playback_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
-
- switch(freebob_streaming_get_playback_stream_type(driver->dev, chn)){
+ freebob_streaming_get_playback_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+
+ switch (freebob_streaming_get_playback_stream_type (driver->dev, chn)) {
case freebob_stream_type_audio:
- snprintf(buf2, 64, "P%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "P%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering playback audio port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
- error=1;
+ printError (" cannot register port for %s", buf2);
+ error = 1;
break;
}
driver->playback_ports =
@@ -211,13 +217,13 @@ freebob_driver_attach (freebob_driver_t *driver)
break;
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
case freebob_stream_type_midi:
- snprintf(buf2, 64, "PM%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "PM%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering playback midi port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
- error=1;
+ printError (" cannot register port for %s", buf2);
+ error = 1;
break;
}
@@ -232,7 +238,9 @@ freebob_driver_attach (freebob_driver_t *driver)
jack_slist_append (driver->playback_ports, NULL);
}
- if(error) break;
+ if (error) {
+ break;
+ }
range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + driver->playback_frame_latency;
jack_port_set_latency_range (port, JackPlaybackLatency, &range);
@@ -252,39 +260,39 @@ freebob_driver_detach (freebob_driver_t *driver)
for (node = driver->capture_ports; node && node->data;
node = jack_slist_next (node)) {
- if(node->data != NULL) {
+ if (node->data != NULL) {
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
}
}
jack_slist_free (driver->capture_ports);
driver->capture_ports = 0;
-
+
for (node = driver->playback_ports; node && node->data;
node = jack_slist_next (node)) {
- if(node->data != NULL) {
+ if (node->data != NULL) {
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
}
}
jack_slist_free (driver->playback_ports);
driver->playback_ports = 0;
- freebob_streaming_finish(driver->dev);
- driver->dev=NULL;
+ freebob_streaming_finish (driver->dev);
+ driver->dev = NULL;
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- freebob_driver_midi_finish(driver->midi_handle);
+ if (driver->midi_handle) {
+ freebob_driver_midi_finish (driver->midi_handle);
}
- driver->midi_handle=NULL;
+ driver->midi_handle = NULL;
#endif
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- free(driver->midi_in_ports);
- free(driver->midi_out_ports);
+ free (driver->midi_in_ports);
+ free (driver->midi_out_ports);
#endif
return 0;
}
@@ -296,66 +304,67 @@ freebob_driver_read (freebob_driver_t * driver, jack_nframes_t nframes)
channel_t chn;
JSList *node;
jack_port_t* port;
-
+
freebob_sample_t nullbuffer[nframes];
- void *addr_of_nullbuffer=(void *)nullbuffer;
+ void *addr_of_nullbuffer = (void*)nullbuffer;
freebob_streaming_stream_type stream_type;
-
- printEnter();
-
+
+ printEnter ();
+
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- stream_type = freebob_streaming_get_capture_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ stream_type = freebob_streaming_get_capture_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- if(!buf) buf=(jack_default_audio_sample_t *)addr_of_nullbuffer;
-
- freebob_streaming_set_capture_stream_buffer(
- driver->dev, chn, (char *)(buf), freebob_buffer_type_float);
+ if (!buf) {
+ buf = (jack_default_audio_sample_t*)addr_of_nullbuffer;
+ }
+
+ freebob_streaming_set_capture_stream_buffer (
+ driver->dev, chn, (char*)(buf), freebob_buffer_type_float);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
unsigned int midibuff[64];
unsigned char midibuff2[64];
int samples_read;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- jack_midi_clear_buffer(buf);
+ jack_midi_clear_buffer (buf);
- samples_read=freebob_streaming_read(
+ samples_read = freebob_streaming_read (
driver->dev, chn, midibuff, 64);
- while(samples_read) {
+ while (samples_read) {
int idx;
int done;
//printMessage("MIDI: ");
- for (idx=0;idx<samples_read;idx++) {
- midibuff2[idx]=(unsigned char)(midibuff[idx] & 0xFF);
+ for (idx = 0; idx < samples_read; idx++)
+ midibuff2[idx] = (unsigned char)(midibuff[idx] & 0xFF);
//printMessage(" %02X", midibuff2[idx]);
- }
- done = midi_unpack_buf(
+ done = midi_unpack_buf (
&driver->midi_in_ports[chn].unpack,
midibuff2, samples_read, buf, 0 /* time */);
- samples_read=freebob_streaming_read(
+ samples_read = freebob_streaming_read (
driver->dev, chn, midibuff, 64);
}
#endif
} else { // empty other buffers without doing something with them
- freebob_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(nullbuffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(nullbuffer), freebob_buffer_type_uint24);
}
}
// now transfer the buffers
- freebob_streaming_transfer_capture_buffers(driver->dev);
-
- printExit();
-
+ freebob_streaming_transfer_capture_buffers (driver->dev);
+
+ printExit ();
+
return 0;
}
@@ -373,93 +382,95 @@ freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes)
freebob_sample_t nullbuffer[nframes];
void *addr_of_nullbuffer = (void*)nullbuffer;
- memset(&nullbuffer,0,nframes*sizeof(freebob_sample_t));
+ memset (&nullbuffer, 0, nframes * sizeof(freebob_sample_t));
- printEnter();
+ printEnter ();
driver->process_count++;
- assert(driver->dev);
+ assert (driver->dev);
- if (driver->engine->freewheeling) {
- return 0;
- }
+ if (driver->engine->freewheeling) {
+ return 0;
+ }
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_playback_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ stream_type = freebob_streaming_get_playback_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- if(!buf) buf=(jack_default_audio_sample_t*)addr_of_nullbuffer;
-
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf), freebob_buffer_type_float);
+ if (!buf) {
+ buf = (jack_default_audio_sample_t*)addr_of_nullbuffer;
+ }
+
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buf), freebob_buffer_type_float);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- } else if(stream_type == freebob_stream_type_midi) {
- int i,idx;
+ } else if (stream_type == freebob_stream_type_midi) {
+ int i, idx;
int samples_written;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- int nevents = jack_midi_get_event_count(buf);
+ int nevents = jack_midi_get_event_count (buf);
- if (nevents)
- printMessage("jack_out: %d events\n", nevents);
- for (i=0; i<nevents; ++i) {
+ if (nevents) {
+ printMessage ("jack_out: %d events\n", nevents);
+ }
+ for (i = 0; i < nevents; ++i) {
jack_midi_event_t event;
-
- jack_midi_event_get(&event, buf, i);
-
- midi_pack_event(&driver->midi_out_ports[chn].packer, &event);
+
+ jack_midi_event_get (&event, buf, i);
+
+ midi_pack_event (&driver->midi_out_ports[chn].packer, &event);
freebob_sample_t midibuff[event.size];
- for (idx=0;idx<event.size;idx++) {
- midibuff[idx]=(freebob_sample_t)(event.buffer[idx]);
- }
+ for (idx = 0; idx < event.size; idx++)
+ midibuff[idx] = (freebob_sample_t)(event.buffer[idx]);
- samples_written=freebob_streaming_write(
+ samples_written = freebob_streaming_write (
driver->dev, chn, midibuff, event.size);
- if (samples_written!=event.size) {
- printMessage("midi out: buffer overrun\n");
+ if (samples_written != event.size) {
+ printMessage ("midi out: buffer overrun\n");
break;
} else {
- printMessage("midi out: sent %d-byte event at %ld\n", (int)event.size, (long)event.time);
+ printMessage ("midi out: sent %d-byte event at %ld\n", (int)event.size, (long)event.time);
}
}
#endif
} else { // empty other buffers without doing something with them
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(nullbuffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(nullbuffer), freebob_buffer_type_uint24);
}
}
- freebob_streaming_transfer_playback_buffers(driver->dev);
+ freebob_streaming_transfer_playback_buffers (driver->dev);
+
+ printExit ();
- printExit();
-
return 0;
}
-//static inline jack_nframes_t
-static jack_nframes_t
+//static inline jack_nframes_t
+static jack_nframes_t
freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
- float *delayed_usecs)
+ float *delayed_usecs)
{
int nframes;
- jack_time_t wait_enter;
- jack_time_t wait_ret;
-
- printEnter();
+ jack_time_t wait_enter;
+ jack_time_t wait_ret;
+
+ printEnter ();
wait_enter = driver->engine->get_microseconds ();
if (wait_enter > driver->wait_next) {
/*
- * This processing cycle was delayed past the
- * next due interrupt! Do not account this as
- * a wakeup delay:
- */
+ * This processing cycle was delayed past the
+ * next due interrupt! Do not account this as
+ * a wakeup delay:
+ */
driver->wait_next = 0;
driver->wait_late++;
}
@@ -467,24 +478,24 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
// *status = -3; timeout
// *status = -4; extra FD
- nframes=freebob_streaming_wait(driver->dev);
-
+ nframes = freebob_streaming_wait (driver->dev);
+
wait_ret = driver->engine->get_microseconds ();
-
+
if (driver->wait_next && wait_ret > driver->wait_next) {
*delayed_usecs = wait_ret - driver->wait_next;
}
driver->wait_last = wait_ret;
driver->wait_next = wait_ret + driver->period_usecs;
driver->engine->transport_cycle_start (driver->engine, wait_ret);
-
+
// transfer the streaming buffers
// we now do this in the read/write functions
-// freebob_streaming_transfer_buffers(driver->dev);
-
+// freebob_streaming_transfer_buffers(driver->dev);
+
if (nframes < 0) {
- *status=0;
-
+ *status = 0;
+
return 0;
//nframes=driver->period_size; //debug
}
@@ -494,53 +505,52 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
// FIXME: this should do something more usefull
*delayed_usecs = 0;
-
- printExit();
+
+ printExit ();
return nframes - nframes % driver->period_size;
-
+
}
static int
freebob_driver_run_cycle (freebob_driver_t *driver)
{
jack_engine_t *engine = driver->engine;
- int wait_status=0;
- float delayed_usecs=0.0;
+ int wait_status = 0;
+ float delayed_usecs = 0.0;
jack_nframes_t nframes = freebob_driver_wait (driver, -1, &wait_status,
- &delayed_usecs);
-
+ &delayed_usecs);
+
if ((wait_status < 0)) {
- printError( "wait status < 0! (= %d)",wait_status);
+ printError ( "wait status < 0! (= %d)", wait_status);
return -1;
}
-
+
if ((nframes == 0)) {
int chn;
- chn=0; // avoid unused variable warning when compiling without jack midi
+ chn = 0; // avoid unused variable warning when compiling without jack midi
/* we detected an xrun and restarted: notify
* clients about the delay. */
- printMessage("xrun detected");
+ printMessage ("xrun detected");
engine->delay (engine, delayed_usecs);
// reset the midi stuff
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
- // init the midi unpacker for this port
- midi_unpack_reset(&driver->midi_in_ports[chn].unpack);
- }
-
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
- // init the midi unpacker for this port
- midi_pack_reset(&driver->midi_out_ports[chn].packer);
- }
+ for (chn = 0; chn < driver->capture_nchannels; chn++)
+ // init the midi unpacker for this port
+ midi_unpack_reset (&driver->midi_in_ports[chn].unpack);
+
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
+ // init the midi unpacker for this port
+ midi_pack_reset (&driver->midi_out_ports[chn].packer);
+
#endif
return 0;
- }
-
+ }
+
return engine->run_cycle (engine, nframes, delayed_usecs);
}
@@ -557,90 +567,90 @@ freebob_driver_null_cycle (freebob_driver_t* driver, jack_nframes_t nframes)
freebob_streaming_stream_type stream_type;
jack_default_audio_sample_t buff[nframes];
- jack_default_audio_sample_t* buffer=(jack_default_audio_sample_t*)buff;
-
- printEnter();
+ jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)buff;
- memset(buffer,0,nframes*sizeof(jack_default_audio_sample_t));
-
- assert(driver->dev);
+ printEnter ();
- if (driver->engine->freewheeling) {
- return 0;
- }
+ memset (buffer, 0, nframes * sizeof(jack_default_audio_sample_t));
+
+ assert (driver->dev);
+
+ if (driver->engine->freewheeling) {
+ return 0;
+ }
// write silence to buffer
nwritten = 0;
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_playback_stream_type(driver->dev, chn);
+ stream_type = freebob_streaming_get_playback_stream_type (driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_float);
+ if (stream_type == freebob_stream_type_audio) {
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_float);
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
// these should be read/written with the per-stream functions
} else { // empty other buffers without doing something with them
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_uint24);
}
}
- freebob_streaming_transfer_playback_buffers(driver->dev);
-
+ freebob_streaming_transfer_playback_buffers (driver->dev);
+
// read & discard from input ports
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_capture_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- freebob_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_float);
+ stream_type = freebob_streaming_get_capture_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ freebob_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_float);
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
} else { // empty other buffers without doing something with them
}
}
// now transfer the buffers
- freebob_streaming_transfer_capture_buffers(driver->dev);
-
- printExit();
+ freebob_streaming_transfer_capture_buffers (driver->dev);
+
+ printExit ();
return 0;
}
static int
freebob_driver_start (freebob_driver_t *driver)
{
- int retval=0;
+ int retval = 0;
int chn;
- chn=0; // avoid unused variable warning when compiling without jack midi
+
+ chn = 0; // avoid unused variable warning when compiling without jack midi
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- if((retval=freebob_driver_midi_start(driver->midi_handle))) {
- printError("Could not start MIDI threads");
+ if (driver->midi_handle) {
+ if ((retval = freebob_driver_midi_start (driver->midi_handle))) {
+ printError ("Could not start MIDI threads");
return retval;
}
}
-#endif
+#endif
// reset the midi stuff
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
+ for (chn = 0; chn < driver->capture_nchannels; chn++)
// init the midi unpacker for this port
- midi_unpack_reset(&driver->midi_in_ports[chn].unpack);
- }
-
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
+ midi_unpack_reset (&driver->midi_in_ports[chn].unpack);
+
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
// init the midi unpacker for this port
- midi_pack_reset(&driver->midi_out_ports[chn].packer);
- }
+ midi_pack_reset (&driver->midi_out_ports[chn].packer);
+
#endif
- if((retval=freebob_streaming_start(driver->dev))) {
- printError("Could not start streaming threads");
+ if ((retval = freebob_streaming_start (driver->dev))) {
+ printError ("Could not start streaming threads");
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- freebob_driver_midi_stop(driver->midi_handle);
+ if (driver->midi_handle) {
+ freebob_driver_midi_stop (driver->midi_handle);
}
#endif
return retval;
@@ -653,18 +663,18 @@ freebob_driver_start (freebob_driver_t *driver)
static int
freebob_driver_stop (freebob_driver_t *driver)
{
- int retval=0;
-
+ int retval = 0;
+
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- if((retval=freebob_driver_midi_stop(driver->midi_handle))) {
- printError("Could not stop MIDI threads");
+ if (driver->midi_handle) {
+ if ((retval = freebob_driver_midi_stop (driver->midi_handle))) {
+ printError ("Could not stop MIDI threads");
return retval;
}
}
-#endif
- if((retval=freebob_streaming_stop(driver->dev))) {
- printError("Could not stop streaming threads");
+#endif
+ if ((retval = freebob_streaming_stop (driver->dev))) {
+ printError ("Could not stop streaming threads");
return retval;
}
@@ -675,15 +685,15 @@ freebob_driver_stop (freebob_driver_t *driver)
static int
freebob_driver_bufsize (freebob_driver_t* driver, jack_nframes_t nframes)
{
- printError("Buffer size change requested but not supported!!!");
+ printError ("Buffer size change requested but not supported!!!");
/*
- driver->period_size = nframes;
- driver->period_usecs =
- (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
- * 1000000.0f);
- */
-
+ driver->period_size = nframes;
+ driver->period_usecs =
+ (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
+ * 1000000.0f);
+ */
+
/* tell the engine to change its buffer size */
#if 0
if (driver->engine->set_buffer_size (driver->engine, nframes)) {
@@ -694,275 +704,278 @@ freebob_driver_bufsize (freebob_driver_t* driver, jack_nframes_t nframes)
return -1; // unsupported
}
-typedef void (*JackDriverFinishFunction) (jack_driver_t *);
+typedef void (*JackDriverFinishFunction)(jack_driver_t *);
freebob_driver_t *
freebob_driver_new (jack_client_t * client,
- char *name,
- freebob_jack_settings_t *params)
+ char *name,
+ freebob_jack_settings_t *params)
{
freebob_driver_t *driver;
- assert(params);
+ assert (params);
- if(freebob_get_api_version() != 1) {
- printMessage("Incompatible libfreebob version! (%s)", freebob_get_version());
+ if (freebob_get_api_version () != 1) {
+ printMessage ("Incompatible libfreebob version! (%s)", freebob_get_version ());
return NULL;
}
- printMessage("Starting Freebob backend (%s)", freebob_get_version());
+ printMessage ("Starting Freebob backend (%s)", freebob_get_version ());
- driver = calloc (1, sizeof (freebob_driver_t));
+ driver = calloc (1, sizeof(freebob_driver_t));
- /* Setup the jack interfaces */
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
+ /* Setup the jack interfaces */
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->nt_attach = (JackDriverNTAttachFunction)freebob_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)freebob_driver_detach;
+ driver->nt_start = (JackDriverNTStartFunction)freebob_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)freebob_driver_stop;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)freebob_driver_run_cycle;
+ driver->null_cycle = (JackDriverNullCycleFunction)freebob_driver_null_cycle;
+ driver->write = (JackDriverReadFunction)freebob_driver_write;
+ driver->read = (JackDriverReadFunction)freebob_driver_read;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)freebob_driver_bufsize;
- driver->nt_attach = (JackDriverNTAttachFunction) freebob_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) freebob_driver_detach;
- driver->nt_start = (JackDriverNTStartFunction) freebob_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) freebob_driver_stop;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) freebob_driver_run_cycle;
- driver->null_cycle = (JackDriverNullCycleFunction) freebob_driver_null_cycle;
- driver->write = (JackDriverReadFunction) freebob_driver_write;
- driver->read = (JackDriverReadFunction) freebob_driver_read;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) freebob_driver_bufsize;
-
/* copy command line parameter contents to the driver structure */
- memcpy(&driver->settings,params,sizeof(freebob_jack_settings_t));
-
+ memcpy (&driver->settings, params, sizeof(freebob_jack_settings_t));
+
/* prepare all parameters */
driver->sample_rate = params->sample_rate;
driver->period_size = params->period_size;
driver->last_wait_ust = 0;
-
+
driver->period_usecs =
- (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
+ (jack_time_t)floor ((((float)driver->period_size) * 1000000.0f) / driver->sample_rate);
driver->client = client;
driver->engine = NULL;
- memset(&driver->device_options,0,sizeof(driver->device_options));
- driver->device_options.sample_rate=params->sample_rate;
- driver->device_options.period_size=params->period_size;
- driver->device_options.nb_buffers=params->buffer_size;
- driver->device_options.node_id=params->node_id;
- driver->device_options.port=params->port;
+ memset (&driver->device_options, 0, sizeof(driver->device_options));
+ driver->device_options.sample_rate = params->sample_rate;
+ driver->device_options.period_size = params->period_size;
+ driver->device_options.nb_buffers = params->buffer_size;
+ driver->device_options.node_id = params->node_id;
+ driver->device_options.port = params->port;
driver->capture_frame_latency = params->capture_frame_latency;
driver->playback_frame_latency = params->playback_frame_latency;
- if(!params->capture_ports) {
+ if (!params->capture_ports) {
driver->device_options.directions |= FREEBOB_IGNORE_CAPTURE;
}
- if(!params->playback_ports) {
+ if (!params->playback_ports) {
driver->device_options.directions |= FREEBOB_IGNORE_PLAYBACK;
}
- debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
- debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
- debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
+ debugPrint (DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
+ debugPrint (DEBUG_LEVEL_STARTUP, " Created driver %s", name);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
+ debugPrint (DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
- return (freebob_driver_t *) driver;
+ return (freebob_driver_t*)driver;
}
static void
freebob_driver_delete (freebob_driver_t *driver)
{
- if(driver->dev) {
- freebob_driver_detach(driver);
+ if (driver->dev) {
+ freebob_driver_detach (driver);
}
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
free (driver);
}
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
/*
* MIDI support
- */
+ */
// the thread that will queue the midi events from the seq to the stream buffers
-void * freebob_driver_midi_queue_thread(void *arg)
+void * freebob_driver_midi_queue_thread (void *arg)
{
- freebob_driver_midi_handle_t *m=(freebob_driver_midi_handle_t *)arg;
- assert(m);
+ freebob_driver_midi_handle_t *m = (freebob_driver_midi_handle_t*)arg;
+
+ assert (m);
snd_seq_event_t *ev;
unsigned char work_buffer[MIDI_TRANSMIT_BUFFER_SIZE];
int bytes_to_send;
int b;
int i;
- printMessage("MIDI queue thread started");
+ printMessage ("MIDI queue thread started");
- while(1) {
+ while (1) {
// get next event, if one is present
- while ((snd_seq_event_input(m->seq_handle, &ev) > 0)) {
- if (ev->source.client == SND_SEQ_CLIENT_SYSTEM)
+ while ((snd_seq_event_input (m->seq_handle, &ev) > 0)) {
+ if (ev->source.client == SND_SEQ_CLIENT_SYSTEM) {
continue;
+ }
// get the port this event is originated from
- freebob_midi_port_t *port=NULL;
- for (i=0;i<m->nb_output_ports;i++) {
- if(m->output_ports[i]->seq_port_nr == ev->dest.port) {
- port=m->output_ports[i];
+ freebob_midi_port_t *port = NULL;
+ for (i = 0; i < m->nb_output_ports; i++) {
+ if (m->output_ports[i]->seq_port_nr == ev->dest.port) {
+ port = m->output_ports[i];
break;
}
}
-
- if(!port) {
- printError(" Could not find target port for event: dst=%d src=%d", ev->dest.port, ev->source.port);
+
+ if (!port) {
+ printError (" Could not find target port for event: dst=%d src=%d", ev->dest.port, ev->source.port);
break;
}
-
+
// decode it to the work buffer
- if((bytes_to_send = snd_midi_event_decode ( port->parser,
- work_buffer,
- MIDI_TRANSMIT_BUFFER_SIZE,
- ev))<0)
- { // failed
- printError(" Error decoding event for port %d (errcode=%d)", port->seq_port_nr,bytes_to_send);
- bytes_to_send=0;
+ if ((bytes_to_send = snd_midi_event_decode ( port->parser,
+ work_buffer,
+ MIDI_TRANSMIT_BUFFER_SIZE,
+ ev)) < 0) { // failed
+ printError (" Error decoding event for port %d (errcode=%d)", port->seq_port_nr, bytes_to_send);
+ bytes_to_send = 0;
//return -1;
}
-
- for(b=0;b<bytes_to_send;b++) {
- freebob_sample_t tmp_event=work_buffer[b];
- if(freebob_streaming_write(m->dev, port->stream_nr, &tmp_event, 1)<1) {
- printError(" Midi send buffer overrun");
+
+ for (b = 0; b < bytes_to_send; b++) {
+ freebob_sample_t tmp_event = work_buffer[b];
+ if (freebob_streaming_write (m->dev, port->stream_nr, &tmp_event, 1) < 1) {
+ printError (" Midi send buffer overrun");
}
}
-
+
}
// sleep for some time
- usleep(MIDI_THREAD_SLEEP_TIME_USECS);
+ usleep (MIDI_THREAD_SLEEP_TIME_USECS);
}
return NULL;
}
// the dequeue thread (maybe we need one thread per stream)
-void *freebob_driver_midi_dequeue_thread (void *arg) {
- freebob_driver_midi_handle_t *m=(freebob_driver_midi_handle_t *)arg;
+void *freebob_driver_midi_dequeue_thread (void *arg)
+{
+ freebob_driver_midi_handle_t *m = (freebob_driver_midi_handle_t*)arg;
int i;
int s;
-
+
int samples_read;
- assert(m);
+ assert (m);
- while(1) {
+ while (1) {
// read incoming events
-
- for (i=0;i<m->nb_input_ports;i++) {
+
+ for (i = 0; i < m->nb_input_ports; i++) {
unsigned int buff[64];
-
- freebob_midi_port_t *port=m->input_ports[i];
-
- if(!port) {
- printError(" something went wrong when setting up the midi input port map (%d)",i);
+
+ freebob_midi_port_t *port = m->input_ports[i];
+
+ if (!port) {
+ printError (" something went wrong when setting up the midi input port map (%d)", i);
}
-
+
do {
- samples_read=freebob_streaming_read(m->dev, port->stream_nr, buff, 64);
-
- for (s=0;s<samples_read;s++) {
- unsigned int *byte=(buff+s) ;
+ samples_read = freebob_streaming_read (m->dev, port->stream_nr, buff, 64);
+
+ for (s = 0; s < samples_read; s++) {
+ unsigned int *byte = (buff + s);
snd_seq_event_t ev;
- if ((snd_midi_event_encode_byte(port->parser,(*byte) & 0xFF, &ev)) > 0) {
+ if ((snd_midi_event_encode_byte (port->parser, (*byte) & 0xFF, &ev)) > 0) {
// a midi message is complete, send it out to ALSA
- snd_seq_ev_set_subs(&ev);
- snd_seq_ev_set_direct(&ev);
- snd_seq_ev_set_source(&ev, port->seq_port_nr);
- snd_seq_event_output_direct(port->seq_handle, &ev);
+ snd_seq_ev_set_subs (&ev);
+ snd_seq_ev_set_direct (&ev);
+ snd_seq_ev_set_source (&ev, port->seq_port_nr);
+ snd_seq_event_output_direct (port->seq_handle, &ev);
}
}
- } while (samples_read>0);
+ } while (samples_read > 0);
}
// sleep for some time
- usleep(MIDI_THREAD_SLEEP_TIME_USECS);
+ usleep (MIDI_THREAD_SLEEP_TIME_USECS);
}
return NULL;
}
-static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver) {
-// int err;
+static freebob_driver_midi_handle_t *freebob_driver_midi_init (freebob_driver_t *driver)
+{
+// int err;
char buf[256];
channel_t chn;
int nchannels;
- int i=0;
+ int i = 0;
- freebob_device_t *dev=driver->dev;
+ freebob_device_t *dev = driver->dev;
- assert(dev);
+ assert (dev);
- freebob_driver_midi_handle_t *m=calloc(1,sizeof(freebob_driver_midi_handle_t));
+ freebob_driver_midi_handle_t *m = calloc (1, sizeof(freebob_driver_midi_handle_t));
if (!m) {
- printError("not enough memory to create midi structure");
+ printError ("not enough memory to create midi structure");
return NULL;
}
- if (snd_seq_open(&m->seq_handle, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK) < 0) {
- printError("Error opening ALSA sequencer.");
- free(m);
+ if (snd_seq_open (&m->seq_handle, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK) < 0) {
+ printError ("Error opening ALSA sequencer.");
+ free (m);
return NULL;
}
- snd_seq_set_client_name(m->seq_handle, "FreeBoB Jack MIDI");
+ snd_seq_set_client_name (m->seq_handle, "FreeBoB Jack MIDI");
// find out the number of midi in/out ports we need to setup
- nchannels=freebob_streaming_get_nb_capture_streams(dev);
+ nchannels = freebob_streaming_get_nb_capture_streams (dev);
- m->nb_input_ports=0;
+ m->nb_input_ports = 0;
- for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_capture_stream_type(dev, chn) == freebob_stream_type_midi) {
+ for (chn = 0; chn < nchannels; chn++) {
+ if (freebob_streaming_get_capture_stream_type (dev, chn) == freebob_stream_type_midi) {
m->nb_input_ports++;
}
}
- m->input_ports=calloc(m->nb_input_ports,sizeof(freebob_midi_port_t *));
- if(!m->input_ports) {
- printError("not enough memory to create midi structure");
- free(m);
+ m->input_ports = calloc (m->nb_input_ports, sizeof(freebob_midi_port_t *));
+ if (!m->input_ports) {
+ printError ("not enough memory to create midi structure");
+ free (m);
return NULL;
}
- i=0;
+ i = 0;
for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_capture_stream_type(dev, chn) == freebob_stream_type_midi) {
- m->input_ports[i]=calloc(1,sizeof(freebob_midi_port_t));
- if(!m->input_ports[i]) {
+ if (freebob_streaming_get_capture_stream_type (dev, chn) == freebob_stream_type_midi) {
+ m->input_ports[i] = calloc (1, sizeof(freebob_midi_port_t));
+ if (!m->input_ports[i]) {
// fixme
- printError("Could not allocate memory for seq port");
+ printError ("Could not allocate memory for seq port");
continue;
}
- freebob_streaming_get_capture_stream_name(dev, chn, buf, sizeof(buf) - 1);
- printMessage("Register MIDI IN port %s", buf);
+ freebob_streaming_get_capture_stream_name (dev, chn, buf, sizeof(buf) - 1);
+ printMessage ("Register MIDI IN port %s", buf);
- m->input_ports[i]->seq_port_nr=snd_seq_create_simple_port(m->seq_handle, buf,
- SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
- SND_SEQ_PORT_TYPE_MIDI_GENERIC);
+ m->input_ports[i]->seq_port_nr = snd_seq_create_simple_port (m->seq_handle, buf,
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ,
+ SND_SEQ_PORT_TYPE_MIDI_GENERIC);
- if(m->input_ports[i]->seq_port_nr<0) {
- printError("Could not create seq port");
- m->input_ports[i]->stream_nr=-1;
- m->input_ports[i]->seq_port_nr=-1;
+ if (m->input_ports[i]->seq_port_nr < 0) {
+ printError ("Could not create seq port");
+ m->input_ports[i]->stream_nr = -1;
+ m->input_ports[i]->seq_port_nr = -1;
} else {
- m->input_ports[i]->stream_nr=chn;
- m->input_ports[i]->seq_handle=m->seq_handle;
- if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->input_ports[i]->parser)) < 0) {
- printError("could not init parser for MIDI IN port %d",i);
- m->input_ports[i]->stream_nr=-1;
- m->input_ports[i]->seq_port_nr=-1;
+ m->input_ports[i]->stream_nr = chn;
+ m->input_ports[i]->seq_handle = m->seq_handle;
+ if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->input_ports[i]->parser)) < 0) {
+ printError ("could not init parser for MIDI IN port %d", i);
+ m->input_ports[i]->stream_nr = -1;
+ m->input_ports[i]->seq_port_nr = -1;
}
}
@@ -971,56 +984,55 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
}
// playback
- nchannels=freebob_streaming_get_nb_playback_streams(dev);
+ nchannels = freebob_streaming_get_nb_playback_streams (dev);
- m->nb_output_ports=0;
+ m->nb_output_ports = 0;
- for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_playback_stream_type(dev, chn) == freebob_stream_type_midi) {
+ for (chn = 0; chn < nchannels; chn++) {
+ if (freebob_streaming_get_playback_stream_type (dev, chn) == freebob_stream_type_midi) {
m->nb_output_ports++;
}
}
- m->output_ports=calloc(m->nb_output_ports,sizeof(freebob_midi_port_t *));
- if(!m->output_ports) {
- printError("not enough memory to create midi structure");
- for (i = 0; i < m->nb_input_ports; i++) {
- free(m->input_ports[i]);
- }
- free(m->input_ports);
- free(m);
+ m->output_ports = calloc (m->nb_output_ports, sizeof(freebob_midi_port_t *));
+ if (!m->output_ports) {
+ printError ("not enough memory to create midi structure");
+ for (i = 0; i < m->nb_input_ports; i++)
+ free (m->input_ports[i]);
+ free (m->input_ports);
+ free (m);
return NULL;
}
- i=0;
+ i = 0;
for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_playback_stream_type(dev, chn) == freebob_stream_type_midi) {
- m->output_ports[i]=calloc(1,sizeof(freebob_midi_port_t));
- if(!m->output_ports[i]) {
+ if (freebob_streaming_get_playback_stream_type (dev, chn) == freebob_stream_type_midi) {
+ m->output_ports[i] = calloc (1, sizeof(freebob_midi_port_t));
+ if (!m->output_ports[i]) {
// fixme
- printError("Could not allocate memory for seq port");
+ printError ("Could not allocate memory for seq port");
continue;
}
- freebob_streaming_get_playback_stream_name(dev, chn, buf, sizeof(buf) - 1);
- printMessage("Register MIDI OUT port %s", buf);
+ freebob_streaming_get_playback_stream_name (dev, chn, buf, sizeof(buf) - 1);
+ printMessage ("Register MIDI OUT port %s", buf);
- m->output_ports[i]->seq_port_nr=snd_seq_create_simple_port(m->seq_handle, buf,
- SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
- SND_SEQ_PORT_TYPE_MIDI_GENERIC);
+ m->output_ports[i]->seq_port_nr = snd_seq_create_simple_port (m->seq_handle, buf,
+ SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE,
+ SND_SEQ_PORT_TYPE_MIDI_GENERIC);
- if(m->output_ports[i]->seq_port_nr<0) {
- printError("Could not create seq port");
- m->output_ports[i]->stream_nr=-1;
- m->output_ports[i]->seq_port_nr=-1;
+ if (m->output_ports[i]->seq_port_nr < 0) {
+ printError ("Could not create seq port");
+ m->output_ports[i]->stream_nr = -1;
+ m->output_ports[i]->seq_port_nr = -1;
} else {
- m->output_ports[i]->stream_nr=chn;
- m->output_ports[i]->seq_handle=m->seq_handle;
- if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->output_ports[i]->parser)) < 0) {
- printError("could not init parser for MIDI OUT port %d",i);
- m->output_ports[i]->stream_nr=-1;
- m->output_ports[i]->seq_port_nr=-1;
+ m->output_ports[i]->stream_nr = chn;
+ m->output_ports[i]->seq_handle = m->seq_handle;
+ if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->output_ports[i]->parser)) < 0) {
+ printError ("could not init parser for MIDI OUT port %d", i);
+ m->output_ports[i]->stream_nr = -1;
+ m->output_ports[i]->seq_port_nr = -1;
}
}
@@ -1028,8 +1040,8 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
}
}
- m->dev=dev;
- m->driver=driver;
+ m->dev = dev;
+ m->driver = driver;
return m;
}
@@ -1037,31 +1049,31 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
static int
freebob_driver_midi_start (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
// start threads
- m->queue_thread_realtime=(m->driver->engine->control->real_time? 1 : 0);
- m->queue_thread_priority=
+ m->queue_thread_realtime = (m->driver->engine->control->real_time ? 1 : 0);
+ m->queue_thread_priority =
m->driver->engine->control->client_priority +
FREEBOB_RT_PRIORITY_MIDI_RELATIVE;
- if (m->queue_thread_priority>98) {
- m->queue_thread_priority=98;
+ if (m->queue_thread_priority > 98) {
+ m->queue_thread_priority = 98;
}
if (m->queue_thread_realtime) {
- printMessage("MIDI threads running with Realtime scheduling, priority %d",
- m->queue_thread_priority);
+ printMessage ("MIDI threads running with Realtime scheduling, priority %d",
+ m->queue_thread_priority);
} else {
- printMessage("MIDI threads running without Realtime scheduling");
+ printMessage ("MIDI threads running without Realtime scheduling");
}
- if (jack_client_create_thread(NULL, &m->queue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_queue_thread, (void *)m)) {
- printError(" cannot create midi queueing thread");
+ if (jack_client_create_thread (NULL, &m->queue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_queue_thread, (void*)m)) {
+ printError (" cannot create midi queueing thread");
return -1;
}
- if (jack_client_create_thread(NULL, &m->dequeue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_dequeue_thread, (void *)m)) {
- printError(" cannot create midi dequeueing thread");
+ if (jack_client_create_thread (NULL, &m->dequeue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_dequeue_thread, (void*)m)) {
+ printError (" cannot create midi dequeueing thread");
return -1;
}
return 0;
@@ -1070,7 +1082,7 @@ freebob_driver_midi_start (freebob_driver_midi_handle_t *m)
static int
freebob_driver_midi_stop (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
pthread_cancel (m->queue_thread);
pthread_join (m->queue_thread, NULL);
@@ -1084,25 +1096,23 @@ freebob_driver_midi_stop (freebob_driver_midi_handle_t *m)
static void
freebob_driver_midi_finish (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
int i;
// TODO: add state info here, if not stopped then stop
- for (i=0;i<m->nb_input_ports;i++) {
- free(m->input_ports[i]);
+ for (i = 0; i < m->nb_input_ports; i++)
+ free (m->input_ports[i]);
- }
- free(m->input_ports);
+ free (m->input_ports);
- for (i=0;i<m->nb_output_ports;i++) {
- free(m->output_ports[i]);
- }
- free(m->output_ports);
+ for (i = 0; i < m->nb_output_ports; i++)
+ free (m->output_ports[i]);
+ free (m->output_ports);
- free(m);
+ free (m);
}
-#endif
+#endif
/*
* dlopen plugin stuff
*/
@@ -1116,12 +1126,12 @@ driver_get_descriptor ()
jack_driver_param_desc_t * params;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
strcpy (desc->name, "freebob");
desc->nparams = 11;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
desc->params = params;
i = 0;
@@ -1131,7 +1141,7 @@ driver_get_descriptor ()
strcpy (params[i].value.str, "hw:0");
strcpy (params[i].short_desc, "The FireWire device to use. Format is: 'hw:port[,node]'.");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "period");
params[i].character = 'p';
@@ -1139,7 +1149,7 @@ driver_get_descriptor ()
params[i].value.ui = 1024;
strcpy (params[i].short_desc, "Frames per period");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "nperiods");
params[i].character = 'n';
@@ -1187,7 +1197,7 @@ driver_get_descriptor ()
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Extra input latency (frames)");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "output-latency");
params[i].character = 'O';
@@ -1203,14 +1213,14 @@ driver_get_descriptor ()
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "outchannels");
params[i].character = 'o';
params[i].type = JackDriverParamUInt;
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)");
- strcpy (params[i].long_desc, params[i].short_desc);
+ strcpy (params[i].long_desc, params[i].short_desc);
return desc;
}
@@ -1221,40 +1231,38 @@ driver_initialize (jack_client_t *client, JSList * params)
{
jack_driver_t *driver;
- unsigned int port=0;
- unsigned int node_id=-1;
- int nbitems;
-
+ unsigned int port = 0;
+ unsigned int node_id = -1;
+ int nbitems;
+
const JSList * node;
const jack_driver_param_t * param;
freebob_jack_settings_t cmlparams;
-
- char *device_name="hw:0";
-
- cmlparams.period_size_set=0;
- cmlparams.sample_rate_set=0;
- cmlparams.buffer_size_set=0;
- cmlparams.port_set=0;
- cmlparams.node_id_set=0;
+
+ char *device_name = "hw:0";
+
+ cmlparams.period_size_set = 0;
+ cmlparams.sample_rate_set = 0;
+ cmlparams.buffer_size_set = 0;
+ cmlparams.port_set = 0;
+ cmlparams.node_id_set = 0;
/* default values */
- cmlparams.period_size=1024;
- cmlparams.sample_rate=48000;
- cmlparams.buffer_size=3;
- cmlparams.port=0;
- cmlparams.node_id=-1;
- cmlparams.playback_ports=0;
- cmlparams.capture_ports=0;
- cmlparams.playback_frame_latency=0;
- cmlparams.capture_frame_latency=0;
-
- for (node = params; node; node = jack_slist_next (node))
- {
- param = (jack_driver_param_t *) node->data;
-
- switch (param->character)
- {
+ cmlparams.period_size = 1024;
+ cmlparams.sample_rate = 48000;
+ cmlparams.buffer_size = 3;
+ cmlparams.port = 0;
+ cmlparams.node_id = -1;
+ cmlparams.playback_ports = 0;
+ cmlparams.capture_ports = 0;
+ cmlparams.playback_frame_latency = 0;
+ cmlparams.capture_frame_latency = 0;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (jack_driver_param_t*)node->data;
+
+ switch (param->character) {
case 'd':
device_name = strdup (param->value.str);
break;
@@ -1265,7 +1273,7 @@ driver_initialize (jack_client_t *client, JSList * params)
case 'n':
cmlparams.buffer_size = param->value.ui;
cmlparams.buffer_size_set = 1;
- break;
+ break;
case 'r':
cmlparams.sample_rate = param->value.ui;
cmlparams.sample_rate_set = 1;
@@ -1300,32 +1308,32 @@ driver_initialize (jack_client_t *client, JSList * params)
cmlparams.capture_ports = TRUE;
}
- nbitems=sscanf(device_name,"hw:%u,%u",&port,&node_id);
- if (nbitems<2) {
- nbitems=sscanf(device_name,"hw:%u",&port);
-
- if(nbitems < 1) {
- free(device_name);
- printError("device (-d) argument not valid\n");
- return NULL;
- } else {
- cmlparams.port = port;
- cmlparams.port_set=1;
-
- cmlparams.node_id = -1;
- cmlparams.node_id_set=0;
- }
- } else {
- cmlparams.port = port;
- cmlparams.port_set=1;
-
- cmlparams.node_id = node_id;
- cmlparams.node_id_set=1;
- }
-
- jack_error("Freebob using Firewire port %d, node %d",cmlparams.port,cmlparams.node_id);
-
- driver=(jack_driver_t *)freebob_driver_new (client, "freebob_pcm", &cmlparams);
+ nbitems = sscanf (device_name, "hw:%u,%u", &port, &node_id);
+ if (nbitems < 2) {
+ nbitems = sscanf (device_name, "hw:%u", &port);
+
+ if (nbitems < 1) {
+ free (device_name);
+ printError ("device (-d) argument not valid\n");
+ return NULL;
+ } else {
+ cmlparams.port = port;
+ cmlparams.port_set = 1;
+
+ cmlparams.node_id = -1;
+ cmlparams.node_id_set = 0;
+ }
+ } else {
+ cmlparams.port = port;
+ cmlparams.port_set = 1;
+
+ cmlparams.node_id = node_id;
+ cmlparams.node_id_set = 1;
+ }
+
+ jack_error ("Freebob using Firewire port %d, node %d", cmlparams.port, cmlparams.node_id);
+
+ driver = (jack_driver_t*)freebob_driver_new (client, "freebob_pcm", &cmlparams);
return driver;
}
@@ -1333,8 +1341,8 @@ driver_initialize (jack_client_t *client, JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- freebob_driver_t *drv=(freebob_driver_t *) driver;
-
+ freebob_driver_t *drv = (freebob_driver_t*)driver;
+
freebob_driver_delete (drv);
}