如何在Raspberry Pi上查询ALSA通道,周期和缓冲区?

时间:2017-09-04 11:17:37

标签: linux raspberry-pi3 alsa

我正在为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上获得缓冲和通道信息?

0 个答案:

没有答案