[alsa-devel] Raspberry PI reports no channels, period and buffer

Petr Kulhavy brain at jikos.cz
Sun Sep 3 11:46:17 CEST 2017


Hi,

I'm writing an audio decoding program for ALSA, which among others 
detects audio capabilities.
It uses the snd_pcm_hw_params_get_XXX() functions for that.
This works well on my Ubuntu PC but on Raspberry PI 3 these calls return 
no information. They return success but the min and max values are 
meaningless.

For instance the period:

     err = snd_pcm_hw_params_get_period_size_min(hw_params, 
&m_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, 
&m_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, 
&m_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, 
&m_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)m_period_min, (unsigned long)m_period_max,
             m_period_min_us, m_period_max_us);


This prints:
Supported period: 0 to 0 frames (1 to 0 us)


     // query buffer size
     err = snd_pcm_hw_params_get_buffer_size_min(hw_params, &m_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, &m_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, 
&m_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, 
&m_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)m_buffer_min, (unsigned long)m_buffer_max,
             m_buffer_min_us, m_buffer_max_us);

This prints:
Supported buffer size: 0 to 0 frames (1 to 0 us)


And so on. Same for the number of periods and channels.
On the other hand the snd_pcm_hw_params_test_XXX() calls do work and 
that way I can detect the rates, formats, accesses.
Why is that? Am I doing something wrong? And more importantly, how can I 
get the buffering and channel information?

Thanks
Petr


More information about the Alsa-devel mailing list