1
ALSA庫中最簡單的方法是從pcm句柄或名稱獲取物理播放設備的文件名稱?如何獲取ALSA中的PCM設備路徑?
例如對於pcm設備hw:0,0
我想獲得/dev/snd/pcmC0D0p
。這很簡單(只是傳輸索引),但對於「默認」或任何其他別名,它並不那麼明顯。
ALSA庫中最簡單的方法是從pcm句柄或名稱獲取物理播放設備的文件名稱?如何獲取ALSA中的PCM設備路徑?
例如對於pcm設備hw:0,0
我想獲得/dev/snd/pcmC0D0p
。這很簡單(只是傳輸索引),但對於「默認」或任何其他別名,它並不那麼明顯。
回答我自己。通過從snd_pcm_info中獲取卡和設備編號,有一種間接的方法。
int err;
const char *device_name = "default";
snd_pcm_t *pcm;
err = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
if (err < 0) {
fprintf(stderr, "Failed to open audio device '%s': %s\n", device_name, snd_strerror(err));
return false;
}
snd_pcm_info_t *info;
err = snd_pcm_info_malloc(&info);
if (err < 0) {
fprintf(stderr, "Failed to allocate PCM info: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_info(pcm, info);
if (err < 0) {
fprintf(stderr, "Failed to get PCM device info: %s\n", snd_strerror(err));
snd_pcm_info_free(info);
goto fail;
}
int card_no = snd_pcm_info_get_card(info);
if (card_no < 0) {
fprintf(stderr, "Failed to get PCM card number: %s\n", snd_strerror(card_no));
snd_pcm_info_free(info);
goto fail;
}
unsigned dev_no = snd_pcm_info_get_device(info);
printf("The ALSA path is: /dev/snd/pcmC%dD%up\n", card_no, dev_no);
snd_pcm_info_free(info);
fail:
snd_pcm_close(pcm);
@jww確實這是一個編程問題!我正在嘗試解決ALSA的編程問題。 – Brain
有PCM設備不完全對應一個內核設備。你將如何處理這些信息? –