diff --git a/pd/src/s_audio_alsa.c b/pd/src/s_audio_alsa.c index 1cc06a7573db18f33b144187a7c18daad8c94d16..25eccd669114de9287d3ab409dcde66e69607064 100644 --- a/pd/src/s_audio_alsa.c +++ b/pd/src/s_audio_alsa.c @@ -838,19 +838,29 @@ void alsa_getdevs(char *indevlist, int *nindevs, char *outdevlist, int *noutdevs, int *canmulti, int maxndev, int devdescsize) { - int ndev = 0, cardno = -1, i, j; + int ndev = 0, cardno = -1; *canmulti = 2; /* supports multiple devices */ + + /* First list devices from the -alsa-adddev command line arg */ + for (ndev = 0; ndev < alsa_nnames; ndev++) + { + if (ndev >= maxndev) + break; + snprintf(indevlist + ndev * devdescsize, devdescsize, "%s", + alsa_names[ndev]); + snprintf(outdevlist + ndev * devdescsize, devdescsize, "%s", + alsa_names[ndev]); + } + + /* Then query hardware devices from ALSA */ while (!snd_card_next(&cardno) && cardno >= 0) { snd_ctl_t *ctl; snd_ctl_card_info_t *info = NULL; char devname[80]; const char *desc; - if (2 * ndev + 2 > maxndev) + if (ndev + 2 > maxndev) break; - /* apparently, "cardno" is just a counter; but check that here */ - if (ndev != cardno) - fprintf(stderr, "oops: ALSA cards not reported in order?\n"); sprintf(devname, "hw:%d", cardno); // fprintf(stderr, "\ntry %s...\n", devname); if (snd_ctl_open(&ctl, devname, 0) >= 0) @@ -865,25 +875,17 @@ void alsa_getdevs(char *indevlist, int *nindevs, desc = "???"; } /* fprintf(stderr, "name: %s\n", snd_ctl_card_info_get_name(info)); */ - sprintf(indevlist + 2*ndev * devdescsize, "%s (hardware)", desc); - sprintf(indevlist + (2*ndev + 1) * devdescsize, "%s (plug-in)", desc); - sprintf(outdevlist + 2*ndev * devdescsize, "%s (hardware)", desc); - sprintf(outdevlist + (2*ndev + 1) * devdescsize, "%s (plug-in)", desc); - ndev++; + sprintf(indevlist + ndev * devdescsize, "%s (hardware)", desc); + sprintf(indevlist + (ndev + 1) * devdescsize, "%s (plug-in)", desc); + sprintf(outdevlist + ndev * devdescsize, "%s (hardware)", desc); + sprintf(outdevlist + (ndev + 1) * devdescsize, "%s (plug-in)", desc); + ndev += 2; if (info) { snd_ctl_card_info_free(info); info = NULL; } } - for (i = 0, j = 2*ndev; i < alsa_nnames; i++, j++) - { - if (j >= maxndev) - break; - snprintf(indevlist + j * devdescsize, devdescsize, "%s", - alsa_names[i]); - snprintf(outdevlist + j * devdescsize, devdescsize, "%s", - alsa_names[i]); - } - *nindevs = *noutdevs = j; + + *nindevs = *noutdevs = ndev; }