Well, I'm makin progress, but it's been kinda slow.
My latest problem is listing midi devices using ALSA apis on ChromeOS 64 bit Crostini (based on Debian).
I currently get this:
sh@penguin:~/src/build-tmidi-Desktop_Qt_6_0_0_GCC_64bit-Release$ ./tmidi
Sat.17:10:31.004 card=0 name=hw:0
Sat.17:10:31.021 ALSA snd_ctl_rawmidi_next_device error: -25=Inappropriate ioctl for device
My little test program is...
// tmidi - dump alsa info (from good ole amidi.c)
#include "../stv/os.h"
#include <alsa/asoundlib.h>
__attribute__((noreturn))
void DieSnd (char *msg, int err)
{ DBG ("ALSA `s error: `d=`s", msg, err, snd_strerror (err)); exit (99); }
static void list_dev (snd_ctl_t *ctl, int card, int dev)
{ int err;
unsigned int isub, osub, nsub, sub;
snd_rawmidi_info_t *inf;
const char *name, *subname;
snd_rawmidi_info_alloca (& inf);
snd_rawmidi_info_set_device (inf, SC(unsigned int,dev));
isub = 0;
snd_rawmidi_info_set_stream (inf, SND_RAWMIDI_STREAM_INPUT);
if (! snd_ctl_rawmidi_info (ctl, inf))
isub = snd_rawmidi_info_get_subdevices_count (inf);
osub = 0;
snd_rawmidi_info_set_stream (inf, SND_RAWMIDI_STREAM_OUTPUT);
if (! snd_ctl_rawmidi_info (ctl, inf))
osub = snd_rawmidi_info_get_subdevices_count (inf);
nsub = (isub > osub) ? isub : osub;
if (! nsub) return;
for (sub = 0; sub < nsub; sub++) {
snd_rawmidi_info_set_stream (
inf, sub < isub ? SND_RAWMIDI_STREAM_INPUT
: SND_RAWMIDI_STREAM_OUTPUT);
snd_rawmidi_info_set_subdevice (inf, sub);
if ((err = snd_ctl_rawmidi_info (ctl, inf)))
DieSnd (CC("snd_ctl_rawmidi_info"), err);
name = snd_rawmidi_info_get_name (inf);
subname = snd_rawmidi_info_get_subdevice_name (inf);
DBG(" card=`d dev=`d sub=`d name=`s subname=`s",
card, dev, sub, name, subname);
if ((sub == 0) && (subname [0] == '\0')) {
DBG ("`s (`c`c hw:`d,`d)", name,
sub < isub ? 'I':' ',
sub < osub ? 'O':' ', card, dev);
if (nsub > 1) DBG (" (`d subdevices)", nsub);
break;
}
else
DBG ("`s (`c`c hw:`d,`d,`d name=`s)", subname,
sub < isub ? 'I':' ',
sub < osub ? 'O':' ', card, dev, sub, name);
}
}
int main ()
{ int err, card, dev;
TStr name;
snd_ctl_t *ctl;
for (card = -1;
{
if ((err = snd_card_next (& card))) DieSnd (CC("snd_card_next"), err);
if (card < 0) break;
StrFmt (name, "hw:`d", card);
DBG("card=`d name=`s", card, name);;
if ((err = snd_ctl_open (& ctl, name, 0)))
DieSnd (CC("snd_ctl_open"), err);
for (dev = -1;
{
if ((err = snd_ctl_rawmidi_next_device (ctl, & dev)))
DieSnd (CC("snd_ctl_rawmidi_next_device"), err);
if (dev < 0) break;
list_dev (ctl, card, dev);
}
snd_ctl_close (ctl);
}
return 0;
}