char *mus_midi_describe(void) { int i, err; snd_rawmidi_t *line; snd_rawmidi_info_t *info; char *buf = NULL; char one[256]; snd_rawmidi_info_malloc(&info); buf = (char *)CALLOC(1024, sizeof(char)); for (i = 0; i < 8; i++) { /* presumably this should use the card|device from the info struct, not a blind loop */ err = snd_rawmidi_open(&line, NULL, mus_midi_device_name(i << 16), SND_RAWMIDI_NONBLOCK); /* do the "devices" matter here? */ if (err < 0) continue; err = snd_rawmidi_info(line, info); if (err < 0) break; sprintf(one, "%s: card: %d, device: %d, stream: %d, flags: %x, id: %s, name: %s[%s; %d]\n", mus_midi_device_name(i << 16), snd_rawmidi_info_get_card(info), /* card number */ snd_rawmidi_info_get_device(info), /* device number */ snd_rawmidi_info_get_stream(info), /* snd_rawmidi_stream_t */ snd_rawmidi_info_get_flags(info), /* 1=out 2=in 4=dupex */ snd_rawmidi_info_get_id(info), /* hardware id (out in?) */ snd_rawmidi_info_get_name(info), snd_rawmidi_info_get_subdevice_name(info), snd_rawmidi_info_get_subdevices_count(info)); strcat(buf, one); } snd_rawmidi_info_free(info); return(buf); }
/* userData is assumed to be a pointer to ALSA_MIDIDeviceDescription. ALSA_MIDIDeviceDescription->index has to be set to the index of the device we want to get information of before this method is called the first time via iterateRawmidiDevices(). On each call of this method, ALSA_MIDIDeviceDescription->index is decremented. If it is equal to zero, we have reached the desired device, so action is taken. So after successful completion of iterateRawmidiDevices(), ALSA_MIDIDeviceDescription->index is zero. If it isn't, this is an indication of an error. */ static int deviceInfoIterator(UINT32 deviceID, snd_rawmidi_info_t *rawmidi_info, snd_ctl_card_info_t *cardinfo, void *userData) { char buffer[300]; ALSA_MIDIDeviceDescription* desc = (ALSA_MIDIDeviceDescription*)userData; #ifdef ALSA_MIDI_USE_PLUGHW int usePlugHw = 1; #else int usePlugHw = 0; #endif TRACE0("deviceInfoIterator\n"); initAlsaSupport(); if (desc->index == 0) { // we found the device with correct index desc->deviceID = deviceID; buffer[0]=' '; buffer[1]='['; // buffer[300] is enough to store the actual device string w/o overrun getDeviceStringFromDeviceID(&buffer[2], deviceID, usePlugHw, ALSA_RAWMIDI); strncat(buffer, "]", sizeof(buffer) - strlen(buffer) - 1); strncpy(desc->name, (cardinfo != NULL) ? snd_ctl_card_info_get_id(cardinfo) : snd_rawmidi_info_get_id(rawmidi_info), desc->strLen - strlen(buffer)); strncat(desc->name, buffer, desc->strLen - strlen(desc->name)); desc->description[0] = 0; if (cardinfo != NULL) { strncpy(desc->description, snd_ctl_card_info_get_name(cardinfo), desc->strLen); strncat(desc->description, ", ", desc->strLen - strlen(desc->description)); } strncat(desc->description, snd_rawmidi_info_get_id(rawmidi_info), desc->strLen - strlen(desc->description)); strncat(desc->description, ", ", desc->strLen - strlen(desc->description)); strncat(desc->description, snd_rawmidi_info_get_name(rawmidi_info), desc->strLen - strlen(desc->description)); TRACE2("Returning %s, %s\n", desc->name, desc->description); return FALSE; // do not continue iteration } desc->index--; return TRUE; }