저는 현재 alsa API (libasound)를 사용하여 개발하는 방법을 배우고 있습니다. 내 USB 사운드 카드에 PCM 사운드를 보내고 싶습니다.libasound가있는 USB 사운드 카드에서 사운드를 재생할 수 없습니다. (C++)
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#include "helloPi.h"
int main(int argc, char *argv[]) {
int i;
int err;
snd_pcm_t *playback_handle;
snd_pcm_hw_params_t *hw_params;
if ((err = snd_pcm_open(&playback_handle, "hw:1,0", SND_PCM_STREAM_PLAYBACK,
0)) < 0) {
fprintf(stderr, "cannot open audio device %s (%s)\n", argv[1],
snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {
fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n",
snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params_any(playback_handle, hw_params)) < 0){
fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n",
snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params_set_access(playback_handle, hw_params,
SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
fprintf(stderr, "cannot set access type (%s)\n", snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params_set_format(playback_handle, hw_params,
SND_PCM_FORMAT_S16_LE)) < 0) {
fprintf(stderr, "cannot set sample format (%s)\n", snd_strerror(err));
exit(1);
}
unsigned int freq = 44100;
if ((err = snd_pcm_hw_params_set_rate_near(playback_handle, hw_params,
&freq, 0)) < 0) {
fprintf(stderr, "cannot set sample rate (%s)\n", snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params_set_channels(playback_handle, hw_params, 2))
< 0) {
fprintf(stderr, "cannot set channel count (%s)\n", snd_strerror(err));
exit(1);
}
if ((err = snd_pcm_hw_params(playback_handle, hw_params)) < 0) {
fprintf(stderr, "cannot set parameters (%s)\n", snd_strerror(err));
exit(1);
}
snd_pcm_hw_params_free(hw_params);
if ((err = snd_pcm_prepare(playback_handle)) < 0) {
fprintf(stderr, "cannot prepare audio interface for use (%s)\n",
snd_strerror(err));
exit(1);
}
for (i = 0; i < 100; ++i) {
if ((err = snd_pcm_writei(playback_handle, buf, 2048)) < 0) {
fprintf(stderr, "write to audio interface failed (%s)\n",
snd_strerror(err));
exit(1);
}
}
snd_pcm_close(playback_handle);
exit(0);
}
의 Nota :
나는이 코드를 실행 buf를하는 음파를 포함 HelloPi.h에서 선언 된 배열입니다.
나는 snd_pcm_open 사용하는 경우 (& playback_handle, "HW : 1,0", SND_PCM_STREAM_PLAYBACK, 0) HW와 : 0,0, 내 노트북의 내장 사운드 카드와 함께 잘 작동합니다. 그러나 hw : 1,을 사용하면 USB 사운드 카드를 사용하는 데 아무런 문제가 없습니다 (오류가 아님).
내가 터미널에서 실행하는 경우 :
aplay -l
나는 다음과 같은 결과가 : 내가 가진 소리를 가지고 있기 때문에 USB 카드가 OK 것을 알고
carte 0: PCH [HDA Intel PCH], périphérique 0: ALC283 Analog [ALC283 Analog]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
carte 0: PCH [HDA Intel PCH], périphérique 3: HDMI 0 [HDMI 0]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
carte 1: Set [C-Media USB Headphone Set], périphérique 0: USB Audio [USB Audio]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
안녕하세요
를 :
speaker-test -Dhw:1,0 -c2 -twav
왜 내 코드가 hw로 소리를내는 노트인지 알 수 없습니다. ...
여러분 중 일부는 저를 도울 수 있기를 바랍니다. 감사합니다.
Maxime.
"아무것도 아님"? 정확히 어떻게됩니까? 얼마나 시간이 걸려요? –
사운드 카드에서 소리가 나지 않습니다. snd_pcm_hw_params()가 즉시 실행됩니다. 내부 사운드 카드의 경우는 아닙니다. – Max