2017-08-28 21 views
1

物理再生デバイスのファイル名をpcmハンドルまたは名前から取得するには、ALSAライブラリで最も簡単な方法は何ですか?ALSAでPCMデバイスのパスを取得するには?

例えば、pcmデバイスの場合hw:0,0/dev/snd/pcmC0D0pを取得したいと思います。これはむしろ単純です(単にインデックスを転送する)が、 "デフォルト"または他のエイリアスではそれほど明白ではない。

+0

@jwwこれはプログラミングに関する質問です。私はALSAのプログラミング問題を解決しようとしています。 – Brain

+0

正確に1つのカーネルデバイスに対応しないPCMデバイスがあります。あなたはこの情報で何をするつもりですか? –

答えて

1

自分自身に答える。間接的な方法として、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); 
関連する問題