Invalid argument when setting periods, buffer, rate

Sleep <[email protected]>
Newsgroups gmane.linux.alsa.user
Message-ID <[email protected]>
Why does the program below issue errors for 
snd_pcm_hw_params_set_period_size(), 
snd_pcm_hw_params_set_buffer_size(), and snd_pcm_hw_params_set_rate()? 
If I raise the value of SAMPLES to 768 it only issues an error to 
snd_pcm_hw_params_set_rate(). The value "512" is important here since I 
am porting a program to ALSA which uses 512 samples as the size of its 
buffer (or 256 frames).

#include <stdlib.h>
#include <stdint.h>
#include <alsa/asoundlib.h>

#define STEREO              2
#define SIXTEENBITS         2
#define SAMPLES           512
#define PERIODS             2
#define SAMPLERATE      11025

void snd_error_checker(int error, char *function_name)
{
     if (error)
     {
         printf("Error (%s): %s\n", function_name, snd_strerror(error));
         // exit(EXIT_FAILURE);
     }
}

int main(void)
{
     snd_pcm_t *handle;
     uint32_t channels                   = STEREO;
     uint32_t sample_size                = SIXTEENBITS;
     uint32_t frame_size                 = sample_size * channels;
     snd_pcm_uframes_t frames            = SAMPLES / frame_size;
     snd_pcm_uframes_t frames_per_period = frames / PERIODS;
     int32_t dir = 0; // No idea what this does.
     snd_pcm_hw_params_t *params;
     int error;

     error = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
     snd_error_checker(error, "snd_pcm_open()");
     snd_pcm_hw_params_malloc(&params);
     error = snd_pcm_hw_params_any(handle, params);
     snd_error_checker(error, "snd_pcm_hw_params_any()");
     error = snd_pcm_hw_params_set_period_size(handle, params, 
frames_per_period, dir);
     snd_error_checker(error, "snd_pcm_hw_params_set_period_size()");
     error = snd_pcm_hw_params_set_periods(handle, params, PERIODS, dir);
     snd_error_checker(error, "snd_pcm_hw_params_set_periods()");
     error = snd_pcm_hw_params_set_buffer_size(handle, params, frames);
     snd_error_checker(error, "snd_pcm_hw_params_set_buffer_size()");
     error = snd_pcm_hw_params_set_rate(handle, params, SAMPLERATE, dir);
     snd_error_checker(error, "snd_pcm_hw_params_set_rate()");
     error = snd_pcm_hw_params_set_access(handle, params, 
SND_PCM_ACCESS_RW_INTERLEAVED);
     snd_error_checker(error, "snd_pcm_hw_params_set_access()");
     error = snd_pcm_hw_params_set_channels(handle, params, STEREO);
     snd_error_checker(error, "snd_pcm_hw_params_set_channels()");
     error = snd_pcm_hw_params_set_format(handle, params, 
SND_PCM_FORMAT_S16_LE);
     snd_error_checker(error, "snd_pcm_hw_params_set_format()");
     error = snd_pcm_hw_params(handle, params);
     snd_error_checker(error, "snd_pcm_hw_params()");

     snd_pcm_drain(handle);
     snd_pcm_close(handle);
     exit(EXIT_SUCCESS);
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.