1
我目前正在學習開發使用alsa API(libasound)。 我想發送PCM聲音到我的USB聲卡。使用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);
}
諾塔:BUF是含有聲波在HelloPi.h聲明的陣列。
當我使用snd_pcm_open(& playback_handle, 「HW:1,0」,SND_PCM_STREAM_PLAYBACK,0)與HW:0,0,是做工精細用我的筆記本電腦的內置聲卡。但是,如果我使用hw:1,0,要使用USB聲卡,什麼也沒有發生(甚至沒有錯誤!)。
如果我在終端運行:
aplay -l
我有以下結果:
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
你好
我知道,USB卡是可以的,因爲我有聲音:
speaker-test -Dhw:1,0 -c2 -twav
我不知道爲什麼我的代碼是音符與hw:1,0 ...
我希望你們中的一些人能幫助我! 謝謝,
Maxime。
「Nothing」?究竟發生了什麼?多久時間? –
沒有聲音熄滅聲卡。 snd_pcm_hw_params()立即執行。內部聲卡並非如此。 – Max