rename query_user_presets to query_preset_names, make it return GStrv
This commit is contained in:
67
gdigi.c
67
gdigi.c
@@ -18,12 +18,12 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <alsa/asoundlib.h>
|
#include <alsa/asoundlib.h>
|
||||||
#include <string.h>
|
#include <alloca.h>
|
||||||
#include "gdigi.h"
|
#include "gdigi.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
|
||||||
static snd_rawmidi_t *output;
|
static snd_rawmidi_t *output = NULL;
|
||||||
static snd_rawmidi_t *input;
|
static snd_rawmidi_t *input = NULL;
|
||||||
static char *device = "hw:1,0,0";
|
static char *device = "hw:1,0,0";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -81,6 +81,11 @@ void send_data(char *data, int length)
|
|||||||
snd_rawmidi_drain(output);
|
snd_rawmidi_drain(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
reads data from MIDI IN
|
||||||
|
returns GString containing data
|
||||||
|
if no data was read it returns NULL
|
||||||
|
*/
|
||||||
GString* read_data()
|
GString* read_data()
|
||||||
{
|
{
|
||||||
/* This is mostly taken straight from alsa-utils-1.0.19 amidi/amidi.c
|
/* This is mostly taken straight from alsa-utils-1.0.19 amidi/amidi.c
|
||||||
@@ -94,7 +99,7 @@ GString* read_data()
|
|||||||
pfds = alloca(npfds * sizeof(struct pollfd));
|
pfds = alloca(npfds * sizeof(struct pollfd));
|
||||||
snd_rawmidi_poll_descriptors(input, pfds, npfds);
|
snd_rawmidi_poll_descriptors(input, pfds, npfds);
|
||||||
|
|
||||||
for (;;) {
|
do {
|
||||||
char buf[20];
|
char buf[20];
|
||||||
int i, length;
|
int i, length;
|
||||||
unsigned short revents;
|
unsigned short revents;
|
||||||
@@ -106,9 +111,6 @@ GString* read_data()
|
|||||||
g_error("poll failed: %s", strerror(errno));
|
g_error("poll failed: %s", strerror(errno));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (err == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((err = snd_rawmidi_poll_descriptors_revents(input, pfds, npfds, &revents)) < 0) {
|
if ((err = snd_rawmidi_poll_descriptors_revents(input, pfds, npfds, &revents)) < 0) {
|
||||||
g_error("cannot get poll events: %s", snd_strerror(errno));
|
g_error("cannot get poll events: %s", snd_strerror(errno));
|
||||||
break;
|
break;
|
||||||
@@ -126,17 +128,18 @@ GString* read_data()
|
|||||||
}
|
}
|
||||||
length = 0;
|
length = 0;
|
||||||
for (i = 0; i < err; ++i)
|
for (i = 0; i < err; ++i)
|
||||||
if (buf[i] != 0xfe) // ignore active sensing
|
if (buf[i] != 0xFE) // ignore active sensing
|
||||||
buf[length++] = buf[i];
|
buf[length++] = buf[i];
|
||||||
if (length == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (string == NULL) {
|
if (length != 0) {
|
||||||
string = g_string_new_len(buf, length);
|
if (string == NULL) {
|
||||||
} else {
|
string = g_string_new_len(buf, length);
|
||||||
string = g_string_append_len(string, buf, length);
|
} else {
|
||||||
|
string = g_string_append_len(string, buf, length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} while (err != 0);
|
||||||
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,12 +274,19 @@ void set_preset_name(int x, gchar *name)
|
|||||||
send_data(set_name, 13+a+3+b);
|
send_data(set_name, 13+a+3+b);
|
||||||
}
|
}
|
||||||
|
|
||||||
void query_user_presets()
|
/*
|
||||||
|
Queries user preset names
|
||||||
|
Valid bank values are PRESETS_SYSTEM and PRESETS_USER
|
||||||
|
Returns GStrv which must be freed with g_strfreev
|
||||||
|
Returns NULL on error
|
||||||
|
*/
|
||||||
|
GStrv query_preset_names(PresetBank bank)
|
||||||
{
|
{
|
||||||
GString *data = NULL;
|
GString *data = NULL;
|
||||||
int x; /* used to iterate over whole reply */
|
int x; /* used to iterate over whole reply */
|
||||||
int n = 0; /* current preset number */
|
int n = 0; /* current preset number */
|
||||||
int n_total; /* total number of presets */
|
int n_total; /* total number of presets */
|
||||||
|
gchar **str_array = NULL;
|
||||||
|
|
||||||
/* clear MIDI IN buffer */
|
/* clear MIDI IN buffer */
|
||||||
data = read_data();
|
data = read_data();
|
||||||
@@ -284,7 +294,9 @@ void query_user_presets()
|
|||||||
g_string_free(data, TRUE);
|
g_string_free(data, TRUE);
|
||||||
|
|
||||||
/* query user preset names */
|
/* query user preset names */
|
||||||
char command[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x21, 0x00, 0x01, 0x6C, 0xF7};
|
char command[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x21, 0x00, 0x00 /* bank */, 0x00 /* checksum */, 0xF7};
|
||||||
|
command[9] = bank;
|
||||||
|
command[10] = calculate_checksum(command, sizeof(command), 10);
|
||||||
send_data(command, sizeof(command));
|
send_data(command, sizeof(command));
|
||||||
|
|
||||||
/* read reply */
|
/* read reply */
|
||||||
@@ -298,7 +310,8 @@ void query_user_presets()
|
|||||||
|
|
||||||
if (data->len >= 10) {
|
if (data->len >= 10) {
|
||||||
n_total = data->str[10];
|
n_total = data->str[10];
|
||||||
printf("Read %d presets\n", n_total);
|
str_array = g_new(gchar*, n_total + 1);
|
||||||
|
str_array[n_total] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (x=11; x<data->len; x++) {
|
for (x=11; x<data->len; x++) {
|
||||||
@@ -309,9 +322,14 @@ void query_user_presets()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (data->str[x] == 0) { // presets are splitted with 0x00
|
if (data->str[x] == 0) { // presets are splitted with 0x00
|
||||||
gchar *name = g_strndup(buf, b);
|
gchar *name;
|
||||||
printf("%d: %s\n", n, name);
|
|
||||||
g_free(name);
|
name = g_new(gchar, b+1);
|
||||||
|
strncpy(name, buf, b);
|
||||||
|
name[b] = 0;
|
||||||
|
if (n < n_total)
|
||||||
|
str_array[n] = name;
|
||||||
|
|
||||||
b = 0;
|
b = 0;
|
||||||
n++;
|
n++;
|
||||||
} else {
|
} else {
|
||||||
@@ -326,6 +344,7 @@ void query_user_presets()
|
|||||||
}
|
}
|
||||||
g_string_free(data, TRUE);
|
g_string_free(data, TRUE);
|
||||||
}
|
}
|
||||||
|
return str_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|||||||
6
gdigi.h
6
gdigi.h
@@ -461,9 +461,15 @@ enum {
|
|||||||
#define USB_AUDIO_PLAYBACK_MIX 12297
|
#define USB_AUDIO_PLAYBACK_MIX 12297
|
||||||
#define USB_AUDIO_LEVEL 12307
|
#define USB_AUDIO_LEVEL 12307
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PRESETS_SYSTEM = 0,
|
||||||
|
PRESETS_USER = 1
|
||||||
|
} PresetBank;
|
||||||
|
|
||||||
void set_option(guint id, guint position, guint value);
|
void set_option(guint id, guint position, guint value);
|
||||||
void switch_user_preset(int x);
|
void switch_user_preset(int x);
|
||||||
void switch_system_preset(int x);
|
void switch_system_preset(int x);
|
||||||
void set_preset_level(int level);
|
void set_preset_level(int level);
|
||||||
|
GStrv query_preset_names(PresetBank bank);
|
||||||
|
|
||||||
#endif /* GDIGI_H */
|
#endif /* GDIGI_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user