add commandline option to set alsa midi device

This commit is contained in:
Tomasz Moń
2009-02-06 21:23:01 +01:00
parent 87908f7c9f
commit 93ebb6b65c
2 changed files with 59 additions and 23 deletions

10
README
View File

@@ -1,4 +1,12 @@
Requirments: alsa, gtk+, glib Requirments: alsa, gtk+, glib
Getting started guide: Getting started guide:
-make && ./gdigi -to compile: make
-to run: ./gdigi
Commandline options:
--device (-d)
Example:
gdigi -d hw:1,0,0
gdigi --device=hw:1,0,0

72
gdigi.c
View File

@@ -16,8 +16,8 @@
#include <stdio.h> #include <stdio.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <getopt.h>
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#include <string.h> #include <string.h>
#include "gdigi.h" #include "gdigi.h"
#include "gui.h" #include "gui.h"
@@ -27,7 +27,7 @@
char buf[255]; char buf[255];
static snd_rawmidi_t *output; static snd_rawmidi_t *output;
static char *port_name = "default"; static char *device = "hw:1,0,0";
/* /*
static char magic[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x7F, 0x7F, 0x04, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x6E, 0xF7, 0x00}; // causes COMAND to be displayed on device? static char magic[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x7F, 0x7F, 0x04, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x6E, 0xF7, 0x00}; // causes COMAND to be displayed on device?
@@ -70,10 +70,22 @@ char calculate_checksum(gchar *array, int length, int check)
return checksum; return checksum;
} }
void open_device() gboolean open_device()
{ {
snd_rawmidi_open(NULL, &output, port_name, SND_RAWMIDI_NONBLOCK); int err;
snd_rawmidi_nonblock(output, 0);
err = snd_rawmidi_open(NULL, &output, device, SND_RAWMIDI_NONBLOCK);
if (err) {
fprintf(stderr, "snd_rawmidi_open %s failed: %d\n", device, err);
return TRUE;
}
err = snd_rawmidi_nonblock(output, 0);
if (err) {
fprintf(stderr, "snd_rawmidi_nonblock failed: %d\n", err);
return TRUE;
}
return FALSE;
} }
void send_data(char *data, int lenght) void send_data(char *data, int lenght)
@@ -84,20 +96,6 @@ void send_data(char *data, int lenght)
snd_rawmidi_write(output, data, lenght); snd_rawmidi_write(output, data, lenght);
} }
int read_device(int bytes)
{
/*int i, x;
i = usb_bulk_read(handle, 132, buf, bytes, TIMEOUT);
//printf("Called read %d. Device returned %d bytes\n", bytes, i);
for (x=0; x<i; x++) {
printf("0x%02x(%c) ", (u_char) buf[x], buf[x] ? (u_char) buf[x] : 32);
}
printf("\n");
if (bytes > 0) return i;
else return 0;*/
}
void check_preset(struct usb_dev_handle *handle) void check_preset(struct usb_dev_handle *handle)
{ {
/*static char magic3[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x2A, 0x00, 0x04, 0x04, 0x00, 0x62, 0x05, 0xF7, 0x00, 0x00}; // seems to query active preset /*static char magic3[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x2A, 0x00, 0x04, 0x04, 0x00, 0x62, 0x05, 0xF7, 0x00, 0x00}; // seems to query active preset
@@ -922,11 +920,41 @@ void set_preset_name(int x, gchar *name)
send_data(set_name, 13+a+3+b); send_data(set_name, 13+a+3+b);
} }
int main(int argc, char **argv) { int main(int argc, char *argv[]) {
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
create_window(); int c;
gtk_main(); while (1) {
static struct option long_options[] = {
{"device", required_argument, 0, 'd'},
{0, 0, 0, 0}
};
int option_index = 0;
c = getopt_long(argc, argv, "d:", long_options, &option_index);
if (c == -1)
break;
switch(c) {
case 'd':
device = optarg;
break;
default:
abort();
}
}
if (open_device() == TRUE) {
GtkWidget *msg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"Failed to open MIDI device");
gtk_dialog_run(GTK_DIALOG(msg));
gtk_widget_destroy(msg);
} else {
create_window();
gtk_main();
}
if (output != NULL) if (output != NULL)
snd_rawmidi_close(output); snd_rawmidi_close(output);