static const char* search_device(void) { int card, err; snd_hwdep_info_t* info; snd_hwdep_info_alloca(&info); card = -1; while (snd_card_next(&card) >= 0 && card >= 0) { char ctl_name[20]; snd_ctl_t* ctl; int device; sprintf(ctl_name, "hw:CARD=%d", card); err = snd_ctl_open(&ctl, ctl_name, SND_CTL_NONBLOCK); if (err < 0) continue; device = -1; while (snd_ctl_hwdep_next_device(ctl, &device) >= 0 && device >= 0) { snd_hwdep_info_set_device(info, device); err = snd_ctl_hwdep_info(ctl, info); if (err >= 0 && snd_hwdep_info_get_iface(info) == SND_HWDEP_IFACE_SB_RC) { static char name[36]; sprintf(name, "hw:CARD=%d,DEV=%d", card, device); snd_ctl_close(ctl); return name; } } snd_ctl_close(ctl); } return NULL; }
static int find_hwdep_device(int *cardP, int *devP) { snd_ctl_t *ctl_handle; snd_ctl_card_info_t *card_info; snd_hwdep_info_t *hwdep_info; int card; int dev; int err; char card_id[32]; ctl_handle = NULL; snd_ctl_card_info_alloca(&card_info); snd_hwdep_info_alloca(&hwdep_info); for (card = 0; card < 7; card++) { *cardP = card; if (ctl_handle) { snd_ctl_close(ctl_handle); ctl_handle = NULL; } // Get control handle for selected card sprintf(card_id, "hw:%i", card); if ((err = snd_ctl_open(&ctl_handle, card_id, 0)) < 0) { fprintf(stderr, "control open (%s): %s", card_id, snd_strerror(err)); return -1; } // Read control hardware info from card if ((err = snd_ctl_card_info(ctl_handle, card_info)) < 0) { fprintf(stderr, "control hardware info (%s): %s", card_id, snd_strerror(err)); continue; } //if (strcmp(snd_ctl_card_info_get_driver(card_info),"BT SCO (d)")) // continue; dev = -1; err = 1; while (1) { int if_type; if (snd_ctl_hwdep_next_device(ctl_handle, &dev) < 0) fprintf(stderr, "hwdep next device (%s): %s", card_id, snd_strerror(err)); if (dev < 0) break; snd_hwdep_info_set_device(hwdep_info, dev); if (snd_ctl_hwdep_info(ctl_handle, hwdep_info) < 0) { if (err != -ENOENT) fprintf(stderr, "control hwdep info (%s): %s", card_id, snd_strerror(err)); continue; } if_type = snd_hwdep_info_get_iface(hwdep_info); if (if_type == SNDRV_HWDEP_IFACE_BT_SCO || if_type==12) { snd_ctl_close(ctl_handle); *devP = dev; return 0; } } } if (ctl_handle) snd_ctl_close(ctl_handle); return -1; }