2017-05-14 16 views
0

현재 함수를 호출하여으로 전달하여 Alsa 장치에 대한 정보를 얻으려고 시도하고 있습니다. 특별히 snd_pcm_query_chmaps에서 채널 정보를 가져올 계획입니다. 내가 얻는 오류 코드는 Device or resource busy입니다. 이 정보를 얻는 또 다른 방법이 있거나 다른 응용 프로그램에서 "바쁜"방식이 아닌 방법으로 pcm을 열면 궁금합니다. 가능하다면이 정보를 어떻게 얻을 수 있습니까? 장치가 바쁠 때 작동합니다.바쁜 Alsa 장치에 대한 정보를 얻을 수 있습니까?

내 코드의 관련 단편은

snd_pcm_t* pcm; 
int err; 
if ((err = snd_pcm_open(&pcm, name, SND_PCM_STREAM_PLAYBACK, 0)) == 0 || (err = snd_pcm_open(&pcm, name, SND_PCM_STREAM_CAPTURE, 0)) == 0) { 
    snd_pcm_info_t* pcm_info; 
    if (snd_pcm_info_malloc(&pcm_info) == 0) { 
     if (snd_pcm_info(pcm, pcm_info) == 0) { 
      printf("Card number: %d\n", snd_pcm_info_get_card(pcm_info)); 
      printf("Device number: %d\n", snd_pcm_info_get_device(pcm_info)); 
      printf("Subdevice number: %d\n", snd_pcm_info_get_subdevice(pcm_info)); 
     } 
     snd_pcm_info_free(pcm_info); 
    } 
    snd_pcm_close(pcm); 
} else { 
    printf("Erroring opening PCM device with error: %s\n", snd_strerror(err)); 
} 

답변

1

이 그것을 열지 않고 PCM 장치에 대한 정보를 얻을 수의 카드의 제어 장치를 열고 snd_ctl_pcm_info()를 호출하는 것입니다. (사용 방법은 aplay source code을 참조하십시오.)

채널 맵 정보는 일부 믹서 컨트롤의 TLV 정보에 제공됩니다. 그것을 읽으려면 도우미 함수 snd_pcm_query_chmaps_from_hw()을 사용하십시오.

+0

나는'snd_pcm_query_chmaps_from_hw' 함수에서 채널 맵 정보를 얻는 방법이 있다는 것을 나중에 깨달았습니다. 문서에서 PCM을 열 필요가 없다고 말했기 때문입니다. 'snd_ctl_pcm_info'에 대한 귀하의 포인터는 도움이되는 것 이상입니다 :) – Greenbeard