summaryrefslogtreecommitdiff
path: root/drivers/am/alsa_rawmidi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/am/alsa_rawmidi.c')
-rw-r--r--drivers/am/alsa_rawmidi.c704
1 files changed, 385 insertions, 319 deletions
diff --git a/drivers/am/alsa_rawmidi.c b/drivers/am/alsa_rawmidi.c
index 9db97fb..ba73561 100644
--- a/drivers/am/alsa_rawmidi.c
+++ b/drivers/am/alsa_rawmidi.c
@@ -38,16 +38,16 @@
#ifdef STANDALONE
-#define MESSAGE(...) fprintf(stderr, __VA_ARGS__)
+#define MESSAGE(...) fprintf (stderr, __VA_ARGS__)
#else
#include "messagebuffer.h"
#endif
-#define info_log(...) MESSAGE(__VA_ARGS__)
-#define error_log(...) MESSAGE(__VA_ARGS__)
+#define info_log(...) MESSAGE (__VA_ARGS__)
+#define error_log(...) MESSAGE (__VA_ARGS__)
#ifdef JACK_MIDI_DEBUG
-#define debug_log(...) MESSAGE(__VA_ARGS__)
+#define debug_log(...) MESSAGE (__VA_ARGS__)
#else
#define debug_log(...)
#endif
@@ -62,13 +62,13 @@ enum {
enum {
#ifndef JACK_MIDI_DEBUG
MAX_PFDS = 64,
- MAX_PORTS = MAX_PFDS-1,
+ MAX_PORTS = MAX_PFDS - 1,
MAX_EVENTS = 4096,
- MAX_DATA = 64*1024,
+ MAX_DATA = 64 * 1024,
MIDI_THREAD_PRIO = 80
#else
MAX_PFDS = 6,
- MAX_PORTS = MAX_PFDS-1,
+ MAX_PORTS = MAX_PFDS - 1,
MAX_EVENTS = 16,
MAX_DATA = 64,
MIDI_THREAD_PRIO = 80
@@ -122,7 +122,7 @@ typedef struct input_port_t {
// jack
midi_unpack_t unpack;
-
+
// midi
int overruns;
} input_port_t;
@@ -132,7 +132,7 @@ typedef struct output_port_t {
// jack
midi_pack_t packer;
-
+
// midi
event_head_t next_event;
int todo;
@@ -212,33 +212,36 @@ static int do_midi_output(process_midi_t *m);
static
-int stream_init(midi_stream_t *s, alsa_rawmidi_t *midi, const char *name)
+int stream_init (midi_stream_t *s, alsa_rawmidi_t *midi, const char *name)
{
s->owner = midi;
s->name = name;
- if (pipe(s->wake_pipe)==-1) {
+ if (pipe (s->wake_pipe) == -1) {
s->wake_pipe[0] = -1;
- error_log("pipe() in stream_init(%s) failed: %s", name, strerror(errno));
+ error_log ("pipe() in stream_init(%s) failed: %s", name, strerror (errno));
return -errno;
}
- s->jack.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
- s->midi.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
- if (!s->jack.new_ports || !s->midi.new_ports)
+ s->jack.new_ports = jack_ringbuffer_create (sizeof(midi_port_t*) * MAX_PORTS);
+ s->midi.new_ports = jack_ringbuffer_create (sizeof(midi_port_t*) * MAX_PORTS);
+ if (!s->jack.new_ports || !s->midi.new_ports) {
return -ENOMEM;
+ }
return 0;
}
static
-void stream_close(midi_stream_t *s)
+void stream_close (midi_stream_t *s)
{
if (s->wake_pipe[0] != -1) {
- close(s->wake_pipe[0]);
- close(s->wake_pipe[1]);
+ close (s->wake_pipe[0]);
+ close (s->wake_pipe[1]);
+ }
+ if (s->jack.new_ports) {
+ jack_ringbuffer_free (s->jack.new_ports);
+ }
+ if (s->midi.new_ports) {
+ jack_ringbuffer_free (s->midi.new_ports);
}
- if (s->jack.new_ports)
- jack_ringbuffer_free(s->jack.new_ports);
- if (s->midi.new_ports)
- jack_ringbuffer_free(s->midi.new_ports);
}
static void alsa_rawmidi_delete(alsa_midi_t *m);
@@ -249,19 +252,22 @@ static int alsa_rawmidi_stop(alsa_midi_t *m);
static void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes);
static void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes);
-alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
+alsa_midi_t* alsa_rawmidi_new (jack_client_t *jack)
{
- alsa_rawmidi_t *midi = calloc(1, sizeof(alsa_rawmidi_t));
- if (!midi)
+ alsa_rawmidi_t *midi = calloc (1, sizeof(alsa_rawmidi_t));
+
+ if (!midi) {
goto fail_0;
+ }
midi->client = jack;
- if (pipe(midi->scan.wake_pipe)==-1) {
- error_log("pipe() in alsa_midi_new failed: %s", strerror(errno));
+ if (pipe (midi->scan.wake_pipe) == -1) {
+ error_log ("pipe() in alsa_midi_new failed: %s", strerror (errno));
goto fail_1;
}
- if (stream_init(&midi->in, midi, "in"))
+ if (stream_init (&midi->in, midi, "in")) {
goto fail_2;
+ }
midi->in.mode = POLLIN;
midi->in.port_size = sizeof(input_port_t);
midi->in.port_init = input_port_init;
@@ -269,8 +275,9 @@ alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
midi->in.process_jack = do_jack_input;
midi->in.process_midi = do_midi_input;
- if (stream_init(&midi->out, midi, "out"))
+ if (stream_init (&midi->out, midi, "out")) {
goto fail_3;
+ }
midi->out.mode = POLLOUT;
midi->out.port_size = sizeof(output_port_t);
midi->out.port_init = output_port_init;
@@ -287,15 +294,15 @@ alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
midi->ops.write = alsa_rawmidi_write;
return &midi->ops;
- fail_3:
- stream_close(&midi->out);
- fail_2:
- stream_close(&midi->in);
- close(midi->scan.wake_pipe[1]);
- close(midi->scan.wake_pipe[0]);
- fail_1:
- free(midi);
- fail_0:
+fail_3:
+ stream_close (&midi->out);
+fail_2:
+ stream_close (&midi->in);
+ close (midi->scan.wake_pipe[1]);
+ close (midi->scan.wake_pipe[0]);
+fail_1:
+ free (midi);
+fail_0:
return NULL;
}
@@ -303,90 +310,94 @@ static
midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
static
-void alsa_rawmidi_delete(alsa_midi_t *m)
+void alsa_rawmidi_delete (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- alsa_rawmidi_detach(m);
+ alsa_rawmidi_detach (m);
- stream_close(&midi->out);
- stream_close(&midi->in);
- close(midi->scan.wake_pipe[0]);
- close(midi->scan.wake_pipe[1]);
+ stream_close (&midi->out);
+ stream_close (&midi->in);
+ close (midi->scan.wake_pipe[0]);
+ close (midi->scan.wake_pipe[1]);
- free(midi);
+ free (midi);
}
static void* scan_thread(void *);
static void *midi_thread(void *arg);
static
-int alsa_rawmidi_attach(alsa_midi_t *m)
+int alsa_rawmidi_attach (alsa_midi_t *m)
{
return 0;
}
static
-int alsa_rawmidi_detach(alsa_midi_t *m)
+int alsa_rawmidi_detach (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
midi_port_t **list;
- alsa_rawmidi_stop(m);
+ alsa_rawmidi_stop (m);
list = &midi->scan.ports;
while (*list) {
(*list)->state = PORT_REMOVED_FROM_JACK;
- list = scan_port_del(midi, list);
+ list = scan_port_del (midi, list);
}
return 0;
}
static
-int alsa_rawmidi_start(alsa_midi_t *m)
+int alsa_rawmidi_start (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
int err;
char c = 'q';
- if (midi->keep_walking == 1)
+
+ if (midi->keep_walking == 1) {
return -EALREADY;
+ }
midi->keep_walking = 1;
- if ((err = jack_client_create_thread(midi->client, &midi->in.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->in))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->in.thread, MIDI_THREAD_PRIO, jack_is_realtime (midi->client), midi_thread, &midi->in))) {
midi->keep_walking = 0;
return err;
}
- if ((err = jack_client_create_thread(midi->client, &midi->out.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->out))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->out.thread, MIDI_THREAD_PRIO, jack_is_realtime (midi->client), midi_thread, &midi->out))) {
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
return err;
}
- if ((err = jack_client_create_thread(midi->client, &midi->scan.thread, 0, 0, scan_thread, midi))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->scan.thread, 0, 0, scan_thread, midi))) {
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- write(midi->out.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
- pthread_join(midi->out.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ write (midi->out.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
+ pthread_join (midi->out.thread, NULL);
return err;
}
return 0;
}
static
-int alsa_rawmidi_stop(alsa_midi_t *m)
+int alsa_rawmidi_stop (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
char c = 'q';
- if (midi->keep_walking == 0)
+
+ if (midi->keep_walking == 0) {
return -EALREADY;
+ }
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- write(midi->out.wake_pipe[1], &c, 1);
- write(midi->scan.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
- pthread_join(midi->out.thread, NULL);
- pthread_join(midi->scan.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ write (midi->out.wake_pipe[1], &c, 1);
+ write (midi->scan.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
+ pthread_join (midi->out.thread, NULL);
+ pthread_join (midi->scan.thread, NULL);
// ports are freed in alsa_midi_detach()
return 0;
}
@@ -394,59 +405,63 @@ int alsa_rawmidi_stop(alsa_midi_t *m)
static void jack_process(midi_stream_t *str, jack_nframes_t nframes);
static
-void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_rawmidi_read (alsa_midi_t *m, jack_nframes_t nframes)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- jack_process(&midi->in, nframes);
+
+ jack_process (&midi->in, nframes);
}
static
-void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_rawmidi_write (alsa_midi_t *m, jack_nframes_t nframes)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- jack_process(&midi->out, nframes);
+
+ jack_process (&midi->out, nframes);
}
/*
* -----------------------------------------------------------------------------
*/
static inline
-int can_pass(size_t sz, jack_ringbuffer_t *in, jack_ringbuffer_t *out)
+int can_pass (size_t sz, jack_ringbuffer_t *in, jack_ringbuffer_t *out)
{
- return jack_ringbuffer_read_space(in) >= sz && jack_ringbuffer_write_space(out) >= sz;
+ return jack_ringbuffer_read_space (in) >= sz && jack_ringbuffer_write_space (out) >= sz;
}
static
-void midi_port_init(const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_info_t *info, const alsa_id_t *id)
+void midi_port_init (const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_info_t *info, const alsa_id_t *id)
{
const char *name;
char *c;
port->id = *id;
- snprintf(port->dev, sizeof(port->dev), "hw:%d,%d,%d", id->id[0], id->id[1], id->id[3]);
- name = snd_rawmidi_info_get_subdevice_name(info);
- if (!strlen(name))
- name = snd_rawmidi_info_get_name(info);
- snprintf(port->name, sizeof(port->name), "%s %s %s", port->id.id[2] ? "out":"in", port->dev, name);
+ snprintf (port->dev, sizeof(port->dev), "hw:%d,%d,%d", id->id[0], id->id[1], id->id[3]);
+ name = snd_rawmidi_info_get_subdevice_name (info);
+ if (!strlen (name)) {
+ name = snd_rawmidi_info_get_name (info);
+ }
+ snprintf (port->name, sizeof(port->name), "%s %s %s", port->id.id[2] ? "out" : "in", port->dev, name);
// replace all offending characters with '-'
- for (c=port->name; *c; ++c)
- if (!isalnum(*c))
+ for (c = port->name; *c; ++c)
+ if (!isalnum (*c)) {
*c = '-';
+ }
port->state = PORT_CREATED;
}
static
-inline int midi_port_open_jack(const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name)
+inline int midi_port_open_jack (const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name)
{
- port->jack = jack_port_register(midi->client, name, JACK_DEFAULT_MIDI_TYPE,
- type | JackPortIsPhysical|JackPortIsTerminal, 0);
+ port->jack = jack_port_register (midi->client, name, JACK_DEFAULT_MIDI_TYPE,
+ type | JackPortIsPhysical | JackPortIsTerminal, 0);
return port->jack == NULL;
}
static
-int midi_port_open(const alsa_rawmidi_t *midi, midi_port_t *port)
+int midi_port_open (const alsa_rawmidi_t *midi, midi_port_t *port)
{
int err;
int type;
@@ -461,45 +476,49 @@ int midi_port_open(const alsa_rawmidi_t *midi, midi_port_t *port)
out = &port->rawmidi;
type = JackPortIsInput;
}
-
- if ((err = snd_rawmidi_open(in, out, port->dev, SND_RAWMIDI_NONBLOCK))<0)
+
+ if ((err = snd_rawmidi_open (in, out, port->dev, SND_RAWMIDI_NONBLOCK)) < 0) {
return err;
+ }
/* Some devices (emu10k1) have subdevs with the same name,
* and we need to generate unique port name for jack */
- snprintf(name, sizeof(name), "%s", port->name);
- if (midi_port_open_jack(midi, port, type, name)) {
+ snprintf (name, sizeof(name), "%s", port->name);
+ if (midi_port_open_jack (midi, port, type, name)) {
int num;
num = port->id.id[3] ? port->id.id[3] : port->id.id[1];
- snprintf(name, sizeof(name), "%s %d", port->name, num);
- if (midi_port_open_jack(midi, port, type, name))
+ snprintf (name, sizeof(name), "%s %d", port->name, num);
+ if (midi_port_open_jack (midi, port, type, name)) {
return 2;
+ }
}
- if ((port->event_ring = jack_ringbuffer_create(MAX_EVENTS*sizeof(event_head_t)))==NULL)
+ if ((port->event_ring = jack_ringbuffer_create (MAX_EVENTS * sizeof(event_head_t))) == NULL) {
return 3;
- if ((port->data_ring = jack_ringbuffer_create(MAX_DATA))==NULL)
+ }
+ if ((port->data_ring = jack_ringbuffer_create (MAX_DATA)) == NULL) {
return 4;
+ }
return 0;
}
static
-void midi_port_close(const alsa_rawmidi_t *midi, midi_port_t *port)
+void midi_port_close (const alsa_rawmidi_t *midi, midi_port_t *port)
{
if (port->data_ring) {
- jack_ringbuffer_free(port->data_ring);
+ jack_ringbuffer_free (port->data_ring);
port->data_ring = NULL;
}
if (port->event_ring) {
- jack_ringbuffer_free(port->event_ring);
+ jack_ringbuffer_free (port->event_ring);
port->event_ring = NULL;
}
if (port->jack) {
- jack_port_unregister(midi->client, port->jack);
+ jack_port_unregister (midi->client, port->jack);
port->jack = NULL;
}
if (port->rawmidi) {
- snd_rawmidi_close(port->rawmidi);
+ snd_rawmidi_close (port->rawmidi);
port->rawmidi = NULL;
}
}
@@ -509,31 +528,33 @@ void midi_port_close(const alsa_rawmidi_t *midi, midi_port_t *port)
*/
static
-int alsa_id_before(const alsa_id_t *p1, const alsa_id_t *p2)
+int alsa_id_before (const alsa_id_t *p1, const alsa_id_t *p2)
{
int i;
- for (i=0; i<4; ++i) {
- if (p1->id[i] < p2->id[i])
+
+ for (i = 0; i < 4; ++i) {
+ if (p1->id[i] < p2->id[i]) {
return 1;
- else if (p1->id[i] > p2->id[i])
+ } else if (p1->id[i] > p2->id[i]) {
return 0;
+ }
}
return 0;
}
static
-void alsa_get_id(alsa_id_t *id, snd_rawmidi_info_t *info)
+void alsa_get_id (alsa_id_t *id, snd_rawmidi_info_t *info)
{
- id->id[0] = snd_rawmidi_info_get_card(info);
- id->id[1] = snd_rawmidi_info_get_device(info);
- id->id[2] = snd_rawmidi_info_get_stream(info) == SND_RAWMIDI_STREAM_OUTPUT ? 1 : 0;
- id->id[3] = snd_rawmidi_info_get_subdevice(info);
+ id->id[0] = snd_rawmidi_info_get_card (info);
+ id->id[1] = snd_rawmidi_info_get_device (info);
+ id->id[2] = snd_rawmidi_info_get_stream (info) == SND_RAWMIDI_STREAM_OUTPUT ? 1 : 0;
+ id->id[3] = snd_rawmidi_info_get_subdevice (info);
}
static inline
-void alsa_error(const char *func, int err)
+void alsa_error (const char *func, int err)
{
- error_log("%s() failed", snd_strerror(err));
+ error_log ("%s() failed", snd_strerror (err));
}
typedef struct {
@@ -546,136 +567,145 @@ typedef struct {
static midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
static
-void scan_cleanup(alsa_rawmidi_t *midi)
+void scan_cleanup (alsa_rawmidi_t *midi)
{
midi_port_t **list = &midi->scan.ports;
+
while (*list)
- list = scan_port_del(midi, list);
+ list = scan_port_del (midi, list);
}
static void scan_card(scan_t *scan);
static midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list);
-void scan_cycle(alsa_rawmidi_t *midi)
+void scan_cycle (alsa_rawmidi_t *midi)
{
int card = -1, err;
scan_t scan;
midi_port_t **ports;
//debug_log("scan: cleanup");
- scan_cleanup(midi);
+ scan_cleanup (midi);
scan.midi = midi;
scan.iterator = &midi->scan.ports;
- snd_rawmidi_info_alloca(&scan.info);
+ snd_rawmidi_info_alloca (&scan.info);
//debug_log("scan: rescan");
- while ((err = snd_card_next(&card))>=0 && card>=0) {
+ while ((err = snd_card_next (&card)) >= 0 && card >= 0) {
char name[32];
- snprintf(name, sizeof(name), "hw:%d", card);
- if ((err = snd_ctl_open(&scan.ctl, name, SND_CTL_NONBLOCK))>=0) {
- scan_card(&scan);
- snd_ctl_close(scan.ctl);
- } else
- alsa_error("scan: snd_ctl_open", err);
+ snprintf (name, sizeof(name), "hw:%d", card);
+ if ((err = snd_ctl_open (&scan.ctl, name, SND_CTL_NONBLOCK)) >= 0) {
+ scan_card (&scan);
+ snd_ctl_close (scan.ctl);
+ } else {
+ alsa_error ("scan: snd_ctl_open", err);
+ }
}
// delayed open to workaround alsa<1.0.14 bug (can't open more than 1 subdevice if ctl is opened).
ports = &midi->scan.ports;
while (*ports) {
midi_port_t *port = *ports;
- if (port->state == PORT_CREATED)
- ports = scan_port_open(midi, ports);
- else
+ if (port->state == PORT_CREATED) {
+ ports = scan_port_open (midi, ports);
+ } else {
ports = &port->next;
+ }
}
}
static void scan_device(scan_t *scan);
static
-void scan_card(scan_t *scan)
+void scan_card (scan_t *scan)
{
int device = -1;
int err;
- while ((err = snd_ctl_rawmidi_next_device(scan->ctl, &device))>=0 && device >=0) {
- snd_rawmidi_info_set_device(scan->info, device);
-
- snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_INPUT);
- snd_rawmidi_info_set_subdevice(scan->info, 0);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
- scan_device(scan);
- else if (err != -ENOENT)
- alsa_error("scan: snd_ctl_rawmidi_info on device", err);
-
- snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_OUTPUT);
- snd_rawmidi_info_set_subdevice(scan->info, 0);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
- scan_device(scan);
- else if (err != -ENOENT)
- alsa_error("scan: snd_ctl_rawmidi_info on device", err);
+ while ((err = snd_ctl_rawmidi_next_device (scan->ctl, &device)) >= 0 && device >= 0) {
+ snd_rawmidi_info_set_device (scan->info, device);
+
+ snd_rawmidi_info_set_stream (scan->info, SND_RAWMIDI_STREAM_INPUT);
+ snd_rawmidi_info_set_subdevice (scan->info, 0);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) >= 0) {
+ scan_device (scan);
+ } else if (err != -ENOENT) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on device", err);
+ }
+
+ snd_rawmidi_info_set_stream (scan->info, SND_RAWMIDI_STREAM_OUTPUT);
+ snd_rawmidi_info_set_subdevice (scan->info, 0);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) >= 0) {
+ scan_device (scan);
+ } else if (err != -ENOENT) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on device", err);
+ }
}
}
static void scan_port_update(scan_t *scan);
static
-void scan_device(scan_t *scan)
+void scan_device (scan_t *scan)
{
int err;
int sub, nsubs = 0;
- nsubs = snd_rawmidi_info_get_subdevices_count(scan->info);
- for (sub=0; sub<nsubs; ++sub) {
- snd_rawmidi_info_set_subdevice(scan->info, sub);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info)) < 0) {
- alsa_error("scan: snd_ctl_rawmidi_info on subdevice", err);
+ nsubs = snd_rawmidi_info_get_subdevices_count (scan->info);
+
+ for (sub = 0; sub < nsubs; ++sub) {
+ snd_rawmidi_info_set_subdevice (scan->info, sub);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) < 0) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on subdevice", err);
continue;
}
- scan_port_update(scan);
+ scan_port_update (scan);
}
}
static midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list);
static
-void scan_port_update(scan_t *scan)
+void scan_port_update (scan_t *scan)
{
midi_port_t **list = scan->iterator;
alsa_id_t id;
- alsa_get_id(&id, scan->info);
- while (*list && alsa_id_before(&(*list)->id, &id))
- list = scan_port_del(scan->midi, list);
+ alsa_get_id (&id, scan->info);
- if (!*list || alsa_id_before(&id, &(*list)->id))
- list = scan_port_add(scan, &id, list);
- else if (*list)
+ while (*list && alsa_id_before (&(*list)->id, &id))
+ list = scan_port_del (scan->midi, list);
+
+ if (!*list || alsa_id_before (&id, &(*list)->id)) {
+ list = scan_port_add (scan, &id, list);
+ } else if (*list) {
list = &(*list)->next;
+ }
scan->iterator = list;
}
static
-midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list)
+midi_port_t** scan_port_add (scan_t *scan, const alsa_id_t *id, midi_port_t **list)
{
midi_port_t *port;
midi_stream_t *str = id->id[2] ? &scan->midi->out : &scan->midi->in;
- port = calloc(1, str->port_size);
- if (!port)
+ port = calloc (1, str->port_size);
+ if (!port) {
return list;
- midi_port_init(scan->midi, port, scan->info, id);
+ }
+ midi_port_init (scan->midi, port, scan->info, id);
port->next = *list;
*list = port;
- error_log("scan: added port %s %s", port->dev, port->name);
+ error_log ("scan: added port %s %s", port->dev, port->name);
return &port->next;
}
static
-midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list)
+midi_port_t** scan_port_open (alsa_rawmidi_t *midi, midi_port_t **list)
{
midi_stream_t *str;
midi_port_t *port;
@@ -683,43 +713,48 @@ midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list)
port = *list;
str = port->id.id[2] ? &midi->out : &midi->in;
- if (jack_ringbuffer_write_space(str->jack.new_ports) < sizeof(port))
+ if (jack_ringbuffer_write_space (str->jack.new_ports) < sizeof(port)) {
goto fail_0;
+ }
- if (midi_port_open(midi, port))
+ if (midi_port_open (midi, port)) {
goto fail_1;
- if ((str->port_init)(midi, port))
+ }
+ if ((str->port_init)(midi, port)) {
goto fail_2;
+ }
port->state = PORT_ADDED_TO_JACK;
- jack_ringbuffer_write(str->jack.new_ports, (char*) &port, sizeof(port));
+ jack_ringbuffer_write (str->jack.new_ports, (char*)&port, sizeof(port));
- error_log("scan: opened port %s %s", port->dev, port->name);
+ error_log ("scan: opened port %s %s", port->dev, port->name);
return &port->next;
- fail_2:
- (str->port_close)(midi, port);
- fail_1:
- midi_port_close(midi, port);
+fail_2:
+ (str->port_close)(midi, port);
+fail_1:
+ midi_port_close (midi, port);
port->state = PORT_ZOMBIFIED;
- fail_0:
- error_log("scan: can't open port %s %s", port->dev, port->name);
+fail_0:
+ error_log ("scan: can't open port %s %s", port->dev, port->name);
return &port->next;
}
static
-midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list)
+midi_port_t** scan_port_del (alsa_rawmidi_t *midi, midi_port_t **list)
{
midi_port_t *port = *list;
+
if (port->state == PORT_REMOVED_FROM_JACK) {
- error_log("scan: deleted port %s %s", port->dev, port->name);
+ error_log ("scan: deleted port %s %s", port->dev, port->name);
*list = port->next;
- if (port->id.id[2] )
+ if (port->id.id[2] ) {
(midi->out.port_close)(midi, port);
- else
+ } else {
(midi->in.port_close)(midi, port);
- midi_port_close(midi, port);
- free(port);
+ }
+ midi_port_close (midi, port);
+ free (port);
return list;
} else {
//debug_log("can't delete port %s, wrong state: %d", port->name, (int)port->state);
@@ -727,111 +762,117 @@ midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list)
}
}
-void* scan_thread(void *arg)
+void* scan_thread (void *arg)
{
alsa_rawmidi_t *midi = arg;
struct pollfd wakeup;
wakeup.fd = midi->scan.wake_pipe[0];
- wakeup.events = POLLIN|POLLERR|POLLNVAL;
+ wakeup.events = POLLIN | POLLERR | POLLNVAL;
while (midi->keep_walking) {
int res;
//error_log("scanning....");
- scan_cycle(midi);
- res = poll(&wakeup, 1, 2000);
- if (res>0) {
+ scan_cycle (midi);
+ res = poll (&wakeup, 1, 2000);
+ if (res > 0) {
char c;
- read(wakeup.fd, &c, 1);
- } else if (res<0 && errno != EINTR)
+ read (wakeup.fd, &c, 1);
+ } else if (res < 0 && errno != EINTR) {
break;
+ }
}
return NULL;
}
-/*
+/*
* ------------------------------- Input/Output ------------------------------
*/
static
-void jack_add_ports(midi_stream_t *str)
+void jack_add_ports (midi_stream_t *str)
{
midi_port_t *port;
- while (can_pass(sizeof(port), str->jack.new_ports, str->midi.new_ports) && str->jack.nports < MAX_PORTS) {
- jack_ringbuffer_read(str->jack.new_ports, (char*)&port, sizeof(port));
+
+ while (can_pass (sizeof(port), str->jack.new_ports, str->midi.new_ports) && str->jack.nports < MAX_PORTS) {
+ jack_ringbuffer_read (str->jack.new_ports, (char*)&port, sizeof(port));
str->jack.ports[str->jack.nports++] = port;
port->state = PORT_ADDED_TO_MIDI;
- jack_ringbuffer_write(str->midi.new_ports, (char*)&port, sizeof(port));
+ jack_ringbuffer_write (str->midi.new_ports, (char*)&port, sizeof(port));
}
}
static
-void jack_process(midi_stream_t *str, jack_nframes_t nframes)
+void jack_process (midi_stream_t *str, jack_nframes_t nframes)
{
int r, w;
process_jack_t proc;
jack_nframes_t cur_frames;
- if (!str->owner->keep_walking)
+ if (!str->owner->keep_walking) {
return;
+ }
proc.midi = str->owner;
proc.nframes = nframes;
- proc.frame_time = jack_last_frame_time(proc.midi->client);
- cur_frames = jack_frame_time(proc.midi->client);
+ proc.frame_time = jack_last_frame_time (proc.midi->client);
+ cur_frames = jack_frame_time (proc.midi->client);
if (proc.frame_time + proc.nframes < cur_frames) {
int periods_lost = (cur_frames - proc.frame_time) / proc.nframes;
proc.frame_time += periods_lost * proc.nframes;
- debug_log("xrun detected: %d periods lost", periods_lost);
+ debug_log ("xrun detected: %d periods lost", periods_lost);
}
// process existing ports
- for (r=0, w=0; r<str->jack.nports; ++r) {
+ for (r = 0, w = 0; r < str->jack.nports; ++r) {
midi_port_t *port = str->jack.ports[r];
proc.port = port;
assert (port->state > PORT_ADDED_TO_JACK && port->state < PORT_REMOVED_FROM_JACK);
- proc.buffer = jack_port_get_buffer(port->jack, nframes);
- if (str->mode == POLLIN)
- jack_midi_clear_buffer(proc.buffer);
+ proc.buffer = jack_port_get_buffer (port->jack, nframes);
+ if (str->mode == POLLIN) {
+ jack_midi_clear_buffer (proc.buffer);
+ }
if (port->state == PORT_REMOVED_FROM_MIDI) {
- port->state = PORT_REMOVED_FROM_JACK; // this signals to scan thread
- continue; // this effectively removes port from the midi->in.jack.ports[]
+ port->state = PORT_REMOVED_FROM_JACK; // this signals to scan thread
+ continue; // this effectively removes port from the midi->in.jack.ports[]
}
(str->process_jack)(&proc);
- if (r != w)
+ if (r != w) {
str->jack.ports[w] = port;
+ }
++w;
}
- if (str->jack.nports != w)
- debug_log("jack_%s: nports %d -> %d", str->name, str->jack.nports, w);
+ if (str->jack.nports != w) {
+ debug_log ("jack_%s: nports %d -> %d", str->name, str->jack.nports, w);
+ }
str->jack.nports = w;
- jack_add_ports(str); // it makes no sense to add them earlier since they have no data yet
+ jack_add_ports (str); // it makes no sense to add them earlier since they have no data yet
// wake midi thread
- write(str->wake_pipe[1], &r, 1);
+ write (str->wake_pipe[1], &r, 1);
}
static
-void *midi_thread(void *arg)
+void *midi_thread (void *arg)
{
midi_stream_t *str = arg;
alsa_rawmidi_t *midi = str->owner;
struct pollfd pfds[MAX_PFDS];
int npfds;
- jack_time_t wait_nsec = 1000*1000*1000; // 1 sec
+ jack_time_t wait_nsec = 1000 * 1000 * 1000; // 1 sec
process_midi_t proc;
proc.midi = midi;
proc.mode = str->mode;
pfds[0].fd = str->wake_pipe[0];
- pfds[0].events = POLLIN|POLLERR|POLLNVAL;
+ pfds[0].events = POLLIN | POLLERR | POLLNVAL;
npfds = 1;
//debug_log("midi_thread(%s): enter", str->name);
@@ -839,47 +880,50 @@ void *midi_thread(void *arg)
while (midi->keep_walking) {
int poll_timeout;
int wait_nanosleep;
- int r=1, w=1; // read,write pos in pfds
- int rp=0, wp=0; // read, write pos in ports
+ int r = 1, w = 1; // read,write pos in pfds
+ int rp = 0, wp = 0; // read, write pos in ports
// sleep
//if (wait_nsec != 1000*1000*1000) {
// debug_log("midi_thread(%s): ", str->name);
// assert (wait_nsec == 1000*1000*1000);
//}
- poll_timeout = wait_nsec / (1000*1000);
- wait_nanosleep = wait_nsec % (1000*1000);
+ poll_timeout = wait_nsec / (1000 * 1000);
+ wait_nanosleep = wait_nsec % (1000 * 1000);
if (wait_nanosleep > NANOSLEEP_RESOLUTION) {
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = wait_nanosleep;
- clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
+ clock_nanosleep (CLOCK_MONOTONIC, 0, &ts, NULL);
}
- int res = poll((struct pollfd*)&pfds, npfds, poll_timeout);
+ int res = poll ((struct pollfd*)&pfds, npfds, poll_timeout);
//debug_log("midi_thread(%s): poll exit: %d", str->name, res);
- if (!midi->keep_walking)
+ if (!midi->keep_walking) {
break;
+ }
if (res < 0) {
- if (errno == EINTR)
+ if (errno == EINTR) {
continue;
- error_log("midi_thread(%s) poll failed: %s", str->name, strerror(errno));
+ }
+ error_log ("midi_thread(%s) poll failed: %s", str->name, strerror (errno));
break;
}
// check wakeup pipe
- if (pfds[0].revents & ~POLLIN)
+ if (pfds[0].revents & ~POLLIN) {
break;
+ }
if (pfds[0].revents & POLLIN) {
char c;
- read(pfds[0].fd, &c, 1);
+ read (pfds[0].fd, &c, 1);
}
// add new ports
- while (jack_ringbuffer_read_space(str->midi.new_ports) >= sizeof(midi_port_t*) && str->midi.nports < MAX_PORTS) {
+ while (jack_ringbuffer_read_space (str->midi.new_ports) >= sizeof(midi_port_t*) && str->midi.nports < MAX_PORTS) {
midi_port_t *port;
- jack_ringbuffer_read(str->midi.new_ports, (char*)&port, sizeof(port));
+ jack_ringbuffer_read (str->midi.new_ports, (char*)&port, sizeof(port));
str->midi.ports[str->midi.nports++] = port;
- debug_log("midi_thread(%s): added port %s", str->name, port->name);
+ debug_log ("midi_thread(%s): added port %s", str->name, port->name);
}
// if (res == 0)
@@ -891,26 +935,29 @@ void *midi_thread(void *arg)
for (rp = 0; rp < str->midi.nports; ++rp) {
midi_port_t *port = str->midi.ports[rp];
- proc.cur_time = jack_frame_time(midi->client);
+ proc.cur_time = jack_frame_time (midi->client);
proc.port = port;
proc.rpfds = &pfds[r];
proc.wpfds = &pfds[w];
proc.max_pfds = MAX_PFDS - w;
r += port->npfds;
if (!(str->process_midi)(&proc)) {
- port->state = PORT_REMOVED_FROM_MIDI; // this signals to jack thread
- continue; // this effectively removes port from array
+ port->state = PORT_REMOVED_FROM_MIDI; // this signals to jack thread
+ continue; // this effectively removes port from array
}
w += port->npfds;
- if (rp != wp)
+ if (rp != wp) {
str->midi.ports[wp] = port;
+ }
++wp;
}
- if (str->midi.nports != wp)
- debug_log("midi_%s: nports %d -> %d", str->name, str->midi.nports, wp);
+ if (str->midi.nports != wp) {
+ debug_log ("midi_%s: nports %d -> %d", str->name, str->midi.nports, wp);
+ }
str->midi.nports = wp;
- if (npfds != w)
- debug_log("midi_%s: npfds %d -> %d", str->name, npfds, w);
+ if (npfds != w) {
+ debug_log ("midi_%s: npfds %d -> %d", str->name, npfds, w);
+ }
npfds = w;
/*
@@ -919,75 +966,79 @@ void *midi_thread(void *arg)
* So, zero timeout will not cause busy-looping.
*/
if (proc.next_time < proc.cur_time) {
- debug_log("%s: late: next_time = %d, cur_time = %d", str->name, (int)proc.next_time, (int)proc.cur_time);
+ debug_log ("%s: late: next_time = %d, cur_time = %d", str->name, (int)proc.next_time, (int)proc.cur_time);
wait_nsec = 0; // we are late
} else if (proc.next_time != NFRAMES_INF) {
jack_time_t wait_frames = proc.next_time - proc.cur_time;
- jack_nframes_t rate = jack_get_sample_rate(midi->client);
- wait_nsec = (wait_frames * (1000*1000*1000)) / rate;
- debug_log("midi_%s: timeout = %d", str->name, (int)wait_frames);
- } else
- wait_nsec = 1000*1000*1000;
+ jack_nframes_t rate = jack_get_sample_rate (midi->client);
+ wait_nsec = (wait_frames * (1000 * 1000 * 1000)) / rate;
+ debug_log ("midi_%s: timeout = %d", str->name, (int)wait_frames);
+ } else {
+ wait_nsec = 1000 * 1000 * 1000;
+ }
//debug_log("midi_thread(%s): wait_nsec = %lld", str->name, wait_nsec);
}
return NULL;
}
static
-int midi_is_ready(process_midi_t *proc)
+int midi_is_ready (process_midi_t *proc)
{
midi_port_t *port = proc->port;
+
if (port->npfds) {
unsigned short revents = 0;
- int res = snd_rawmidi_poll_descriptors_revents(port->rawmidi, proc->rpfds, port->npfds, &revents);
+ int res = snd_rawmidi_poll_descriptors_revents (port->rawmidi, proc->rpfds, port->npfds, &revents);
if (res) {
- error_log("snd_rawmidi_poll_descriptors_revents failed on port %s with: %s", port->name, snd_strerror(res));
+ error_log ("snd_rawmidi_poll_descriptors_revents failed on port %s with: %s", port->name, snd_strerror (res));
return 0;
}
if (revents & ~proc->mode) {
- debug_log("midi: port %s failed", port->name);
+ debug_log ("midi: port %s failed", port->name);
return 0;
}
if (revents & proc->mode) {
port->is_ready = 1;
- debug_log("midi: is_ready %s", port->name);
+ debug_log ("midi: is_ready %s", port->name);
}
}
return 1;
}
static
-int midi_update_pfds(process_midi_t *proc)
+int midi_update_pfds (process_midi_t *proc)
{
midi_port_t *port = proc->port;
+
if (port->npfds == 0) {
- port->npfds = snd_rawmidi_poll_descriptors_count(port->rawmidi);
+ port->npfds = snd_rawmidi_poll_descriptors_count (port->rawmidi);
if (port->npfds > proc->max_pfds) {
- debug_log("midi: not enough pfds for port %s", port->name);
+ debug_log ("midi: not enough pfds for port %s", port->name);
return 0;
}
- snd_rawmidi_poll_descriptors(port->rawmidi, proc->wpfds, port->npfds);
+ snd_rawmidi_poll_descriptors (port->rawmidi, proc->wpfds, port->npfds);
} else if (proc->rpfds != proc->wpfds) {
- memmove(proc->wpfds, proc->rpfds, sizeof(struct pollfd) * port->npfds);
+ memmove (proc->wpfds, proc->rpfds, sizeof(struct pollfd) * port->npfds);
}
return 1;
}
-/*
+/*
* ------------------------------------ Input ------------------------------
*/
static
-int input_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
+int input_port_init (alsa_rawmidi_t *midi, midi_port_t *port)
{
input_port_t *in = (input_port_t*)port;
- midi_unpack_init(&in->unpack);
+
+ midi_unpack_init (&in->unpack);
return 0;
}
static
-void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
+void input_port_close (alsa_rawmidi_t *midi, midi_port_t *port)
{
}
@@ -996,41 +1047,44 @@ void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
*/
static
-void do_jack_input(process_jack_t *p)
+void do_jack_input (process_jack_t *p)
{
- input_port_t *port = (input_port_t*) p->port;
+ input_port_t *port = (input_port_t*)p->port;
event_head_t event;
- while (jack_ringbuffer_read_space(port->base.event_ring) >= sizeof(event)) {
+
+ while (jack_ringbuffer_read_space (port->base.event_ring) >= sizeof(event)) {
jack_ringbuffer_data_t vec[2];
jack_nframes_t time;
int i, todo;
- jack_ringbuffer_read(port->base.event_ring, (char*)&event, sizeof(event));
+ jack_ringbuffer_read (port->base.event_ring, (char*)&event, sizeof(event));
// TODO: take into account possible warping
- if ((event.time + p->nframes) < p->frame_time)
+ if ((event.time + p->nframes) < p->frame_time) {
time = 0;
- else if (event.time >= p->frame_time)
- time = p->nframes -1;
- else
+ } else if (event.time >= p->frame_time) {
+ time = p->nframes - 1;
+ } else {
time = event.time + p->nframes - p->frame_time;
+ }
- jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
+ jack_ringbuffer_get_read_vector (port->base.data_ring, vec);
assert ((vec[0].len + vec[1].len) >= event.size);
- if (event.overruns)
- midi_unpack_reset(&port->unpack);
+ if (event.overruns) {
+ midi_unpack_reset (&port->unpack);
+ }
todo = event.size;
- for (i=0; i<2 && todo>0; ++i) {
+ for (i = 0; i < 2 && todo > 0; ++i) {
int avail = todo < vec[i].len ? todo : vec[i].len;
- int done = midi_unpack_buf(&port->unpack, (unsigned char*)vec[i].buf, avail, p->buffer, time);
+ int done = midi_unpack_buf (&port->unpack, (unsigned char*)vec[i].buf, avail, p->buffer, time);
if (done != avail) {
- debug_log("jack_in: buffer overflow in port %s", port->base.name);
+ debug_log ("jack_in: buffer overflow in port %s", port->base.name);
break;
}
todo -= done;
}
- jack_ringbuffer_read_advance(port->base.data_ring, event.size);
+ jack_ringbuffer_read_advance (port->base.data_ring, event.size);
}
}
@@ -1038,28 +1092,31 @@ void do_jack_input(process_jack_t *p)
* Low level input.
*/
static
-int do_midi_input(process_midi_t *proc)
+int do_midi_input (process_midi_t *proc)
{
- input_port_t *port = (input_port_t*) proc->port;
- if (!midi_is_ready(proc))
+ input_port_t *port = (input_port_t*)proc->port;
+
+ if (!midi_is_ready (proc)) {
return 0;
+ }
if (port->base.is_ready) {
jack_ringbuffer_data_t vec[2];
int res;
- jack_ringbuffer_get_write_vector(port->base.data_ring, vec);
- if (jack_ringbuffer_write_space(port->base.event_ring) < sizeof(event_head_t) || vec[0].len < 1) {
+ jack_ringbuffer_get_write_vector (port->base.data_ring, vec);
+ if (jack_ringbuffer_write_space (port->base.event_ring) < sizeof(event_head_t) || vec[0].len < 1) {
port->overruns++;
- if (port->base.npfds)
- debug_log("midi_in: internal overflow on %s", port->base.name);
+ if (port->base.npfds) {
+ debug_log ("midi_in: internal overflow on %s", port->base.name);
+ }
// remove from poll to prevent busy-looping
port->base.npfds = 0;
return 1;
}
- res = snd_rawmidi_read(port->base.rawmidi, vec[0].buf, vec[0].len);
+ res = snd_rawmidi_read (port->base.rawmidi, vec[0].buf, vec[0].len);
if (res < 0 && res != -EWOULDBLOCK) {
- error_log("midi_in: reading from port %s failed: %s", port->base.name, snd_strerror(res));
+ error_log ("midi_in: reading from port %s failed: %s", port->base.name, snd_strerror (res));
return 0;
} else if (res > 0) {
event_head_t event;
@@ -1067,94 +1124,101 @@ int do_midi_input(process_midi_t *proc)
event.size = res;
event.overruns = port->overruns;
port->overruns = 0;
- debug_log("midi_in: read %d bytes at %d", (int)event.size, (int)event.time);
- jack_ringbuffer_write_advance(port->base.data_ring, event.size);
- jack_ringbuffer_write(port->base.event_ring, (char*)&event, sizeof(event));
+ debug_log ("midi_in: read %d bytes at %d", (int)event.size, (int)event.time);
+ jack_ringbuffer_write_advance (port->base.data_ring, event.size);
+ jack_ringbuffer_write (port->base.event_ring, (char*)&event, sizeof(event));
}
port->base.is_ready = 0;
}
- if (!midi_update_pfds(proc))
+ if (!midi_update_pfds (proc)) {
return 0;
+ }
return 1;
}
-/*
+/*
* ------------------------------------ Output ------------------------------
*/
-static int output_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
+static int output_port_init (alsa_rawmidi_t *midi, midi_port_t *port)
{
output_port_t *out = (output_port_t*)port;
- midi_pack_reset(&out->packer);
+
+ midi_pack_reset (&out->packer);
out->next_event.time = 0;
out->next_event.size = 0;
out->todo = 0;
return 0;
}
-static void output_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
+static void output_port_close (alsa_rawmidi_t *midi, midi_port_t *port)
{
}
static
-void do_jack_output(process_jack_t *proc)
+void do_jack_output (process_jack_t *proc)
{
- output_port_t *port = (output_port_t*) proc->port;
- int nevents = jack_midi_get_event_count(proc->buffer);
+ output_port_t *port = (output_port_t*)proc->port;
+ int nevents = jack_midi_get_event_count (proc->buffer);
int i;
- if (nevents)
- debug_log("jack_out: %d events in %s", nevents, port->base.name);
- for (i=0; i<nevents; ++i) {
+
+ if (nevents) {
+ debug_log ("jack_out: %d events in %s", nevents, port->base.name);
+ }
+ for (i = 0; i < nevents; ++i) {
jack_midi_event_t event;
event_head_t hdr;
- jack_midi_event_get(&event, proc->buffer, i);
+ jack_midi_event_get (&event, proc->buffer, i);
- if (jack_ringbuffer_write_space(port->base.data_ring) < event.size || jack_ringbuffer_write_space(port->base.event_ring) < sizeof(hdr)) {
- debug_log("jack_out: output buffer overflow on %s", port->base.name);
+ if (jack_ringbuffer_write_space (port->base.data_ring) < event.size || jack_ringbuffer_write_space (port->base.event_ring) < sizeof(hdr)) {
+ debug_log ("jack_out: output buffer overflow on %s", port->base.name);
break;
}
- midi_pack_event(&port->packer, &event);
+ midi_pack_event (&port->packer, &event);
- jack_ringbuffer_write(port->base.data_ring, (char*)event.buffer, event.size);
+ jack_ringbuffer_write (port->base.data_ring, (char*)event.buffer, event.size);
hdr.time = proc->frame_time + event.time + proc->nframes;
hdr.size = event.size;
- jack_ringbuffer_write(port->base.event_ring, (char*)&hdr, sizeof(hdr));
- debug_log("jack_out: sent %d-byte event at %ld", (int)event.size, (long)event.time);
+ jack_ringbuffer_write (port->base.event_ring, (char*)&hdr, sizeof(hdr));
+ debug_log ("jack_out: sent %d-byte event at %ld", (int)event.size, (long)event.time);
}
}
static
-int do_midi_output(process_midi_t *proc)
+int do_midi_output (process_midi_t *proc)
{
int worked = 0;
- output_port_t *port = (output_port_t*) proc->port;
+ output_port_t *port = (output_port_t*)proc->port;
- if (!midi_is_ready(proc))
+ if (!midi_is_ready (proc)) {
return 0;
+ }
// eat events
while (port->next_event.time <= proc->cur_time) {
port->todo += port->next_event.size;
- if (jack_ringbuffer_read(port->base.event_ring, (char*)&port->next_event, sizeof(port->next_event))!=sizeof(port->next_event)) {
+ if (jack_ringbuffer_read (port->base.event_ring, (char*)&port->next_event, sizeof(port->next_event)) != sizeof(port->next_event)) {
port->next_event.time = 0;
port->next_event.size = 0;
break;
- } else
- debug_log("midi_out: at %ld got %d bytes for %ld", (long)proc->cur_time, (int)port->next_event.size, (long)port->next_event.time);
+ } else {
+ debug_log ("midi_out: at %ld got %d bytes for %ld", (long)proc->cur_time, (int)port->next_event.size, (long)port->next_event.time);
+ }
+ }
+
+ if (port->todo) {
+ debug_log ("midi_out: todo = %d at %ld", (int)port->todo, (long)proc->cur_time);
}
-
- if (port->todo)
- debug_log("midi_out: todo = %d at %ld", (int)port->todo, (long)proc->cur_time);
// calc next wakeup time
if (!port->todo && port->next_event.time && port->next_event.time < proc->next_time) {
proc->next_time = port->next_event.time;
- debug_log("midi_out: next_time = %ld", (long)proc->next_time);
+ debug_log ("midi_out: next_time = %ld", (long)proc->next_time);
}
if (port->todo && port->base.is_ready) {
@@ -1163,41 +1227,43 @@ int do_midi_output(process_midi_t *proc)
int res;
jack_ringbuffer_data_t vec[2];
- jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
+ jack_ringbuffer_get_read_vector (port->base.data_ring, vec);
if (size > vec[0].len) {
size = vec[0].len;
assert (size > 0);
}
- res = snd_rawmidi_write(port->base.rawmidi, vec[0].buf, size);
+ res = snd_rawmidi_write (port->base.rawmidi, vec[0].buf, size);
if (res > 0) {
- jack_ringbuffer_read_advance(port->base.data_ring, res);
- debug_log("midi_out: written %d bytes to %s", res, port->base.name);
+ jack_ringbuffer_read_advance (port->base.data_ring, res);
+ debug_log ("midi_out: written %d bytes to %s", res, port->base.name);
port->todo -= res;
worked = 1;
} else if (res == -EWOULDBLOCK) {
port->base.is_ready = 0;
- debug_log("midi_out: -EWOULDBLOCK on %s", port->base.name);
+ debug_log ("midi_out: -EWOULDBLOCK on %s", port->base.name);
return 1;
} else {
- error_log("midi_out: writing to port %s failed: %s", port->base.name, snd_strerror(res));
+ error_log ("midi_out: writing to port %s failed: %s", port->base.name, snd_strerror (res));
return 0;
}
- snd_rawmidi_drain(port->base.rawmidi);
+ snd_rawmidi_drain (port->base.rawmidi);
}
// update pfds for this port
- if (!midi_update_pfds(proc))
+ if (!midi_update_pfds (proc)) {
return 0;
+ }
if (!port->todo) {
int i;
- if (worked)
- debug_log("midi_out: relaxing on %s", port->base.name);
- for (i=0; i<port->base.npfds; ++i)
+ if (worked) {
+ debug_log ("midi_out: relaxing on %s", port->base.name);
+ }
+ for (i = 0; i < port->base.npfds; ++i)
proc->wpfds[i].events &= ~POLLOUT;
} else {
int i;
- for (i=0; i<port->base.npfds; ++i)
+ for (i = 0; i < port->base.npfds; ++i)
proc->wpfds[i].events |= POLLOUT;
}
return 1;