我正在为ALSA编写音频解码程序,其中包括检测音频功能。
它使用snd_pcm_hw_params_get_XXX()
函数。
这在我的Ubuntu PC上运行良好,但在Raspberry Pi 3上,这些调用不返回任何信息。它们返回成功但最小值和最大值毫无意义。
例如期间:
int err;
snd_pcm_t *pcm;
snd_pcm_hw_params_t *hw_params;
const char* device_name = "hw:0,0";
// open audio device
err = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to open audio device '%s': %s\n", device_name, snd_strerror(err));
return false;
}
// initialize
snd_pcm_hw_params_alloca(&hw_params);
err = snd_pcm_hw_params_any(pcm, hw_params);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to get hardware parameters: %s\n", snd_strerror(err));
goto fail;
}
// query period size
snd_pcm_uframes_t period_min;
snd_pcm_uframes_t period_max;
unsigned period_min_us;
unsigned period_max_us;
err = snd_pcm_hw_params_get_period_size_min(hw_params, &period_min, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to get minimum period time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_period_size_max(hw_params, &period_max, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to get maximum period time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_period_time_min(hw_params, &period_min_us, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to get minimum period time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_period_time_max(hw_params, &period_max_us, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed to get maximum period time: %s\n", snd_strerror(err));
goto fail;
}
LOG(LOG_DEBUG, LOG_OBJ "Supported period: %lu to %lu frames (%u to %u us)\n",
(unsigned long)period_min, (unsigned long)period_max,
period_min_us, period_max_us);
打印:
Supported period: 0 to 0 frames (1 to 0 us)
或缓冲区大小:
snd_pcm_uframes_t buffer_min;
snd_pcm_uframes_t buffer_max;
unsigned buffer_min_us;
unsigned buffer_max_us;
err = snd_pcm_hw_params_get_buffer_size_min(hw_params, &buffer_min);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed get minimum buffer time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_buffer_size_max(hw_params, &buffer_max);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed get maximum buffer time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_buffer_time_min(hw_params, &buffer_min_us, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed get minimum buffer time: %s\n", snd_strerror(err));
goto fail;
}
err = snd_pcm_hw_params_get_buffer_time_max(hw_params, &buffer_max_us, NULL);
if (err < 0) {
LOG(LOG_ERROR, LOG_OBJ "Failed get maximum buffer time: %s\n", snd_strerror(err));
goto fail;
}
LOG(LOG_DEBUG, LOG_OBJ "Supported buffer size: %lu to %lu frames (%u to %u us)\n",
(unsigned long)buffer_min, (unsigned long)buffer_max,
buffer_min_us, buffer_max_us);
打印:
Supported buffer size: 0 to 0 frames (1 to 0 us)
等等。期间和渠道的数量相同。
另一方面,snd_pcm_hw_params_test_XXX()
调用确实有效,这样我可以检测速率,格式和访问。
为什么get函数没有返回有意义的信息?难道我做错了什么?更重要的是,如何在Raspberry Pi上获得缓冲和通道信息?