*/
int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, struct slave_params *params)
{
- snd_pcm_hw_params_t *hw_params;
- snd_pcm_sw_params_t *sw_params;
+ snd_pcm_hw_params_t hw_params = {0};
+ snd_pcm_sw_params_t sw_params = {0};
int ret, buffer_is_not_initialized;
snd_pcm_uframes_t boundary;
struct pollfd fd;
int loops = 10;
- snd_pcm_hw_params_alloca(&hw_params);
- snd_pcm_sw_params_alloca(&sw_params);
-
__again:
if (loops-- <= 0) {
SNDERR("unable to find a valid configuration for slave");
return -EINVAL;
}
- ret = snd_pcm_hw_params_any(spcm, hw_params);
+ ret = snd_pcm_hw_params_any(spcm, &hw_params);
if (ret < 0) {
SNDERR("snd_pcm_hw_params_any failed");
return ret;
}
- ret = snd_pcm_hw_params_set_access(spcm, hw_params,
+ ret = snd_pcm_hw_params_set_access(spcm, &hw_params,
SND_PCM_ACCESS_MMAP_INTERLEAVED);
if (ret < 0) {
- ret = snd_pcm_hw_params_set_access(spcm, hw_params,
+ ret = snd_pcm_hw_params_set_access(spcm, &hw_params,
SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
if (ret < 0) {
SNDERR("slave plugin does not support mmap interleaved or mmap noninterleaved access");
if (params->format == SND_PCM_FORMAT_UNKNOWN)
ret = -EINVAL;
else
- ret = snd_pcm_hw_params_set_format(spcm, hw_params,
+ ret = snd_pcm_hw_params_set_format(spcm, &hw_params,
params->format);
if (ret < 0) {
static const snd_pcm_format_t dmix_formats[] = {
for (i = 0; i < ARRAY_SIZE(dmix_formats); ++i) {
format = dmix_formats[i];
- ret = snd_pcm_hw_params_set_format(spcm, hw_params,
+ ret = snd_pcm_hw_params_set_format(spcm, &hw_params,
format);
if (ret >= 0)
break;
if (ret < 0 && dmix->type != SND_PCM_TYPE_DMIX) {
/* TODO: try to choose a good format */
ret = INTERNAL(snd_pcm_hw_params_set_format_first)(spcm,
- hw_params, &format);
+ &hw_params, &format);
}
if (ret < 0) {
SNDERR("requested or auto-format is not available");
}
params->format = format;
}
- ret = INTERNAL(snd_pcm_hw_params_set_channels_near)(spcm, hw_params,
+ ret = INTERNAL(snd_pcm_hw_params_set_channels_near)(spcm, &hw_params,
(unsigned int *)¶ms->channels);
if (ret < 0) {
SNDERR("requested count of channels is not available");
return ret;
}
- ret = INTERNAL(snd_pcm_hw_params_set_rate_near)(spcm, hw_params,
+ ret = INTERNAL(snd_pcm_hw_params_set_rate_near)(spcm, &hw_params,
(unsigned int *)¶ms->rate, 0);
if (ret < 0) {
SNDERR("requested rate is not available");
buffer_is_not_initialized = 0;
if (params->buffer_time > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(spcm,
- hw_params, (unsigned int *)¶ms->buffer_time, 0);
+ &hw_params, (unsigned int *)¶ms->buffer_time, 0);
if (ret < 0) {
SNDERR("unable to set buffer time");
return ret;
}
} else if (params->buffer_size > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(spcm,
- hw_params, (snd_pcm_uframes_t *)¶ms->buffer_size);
+ &hw_params, (snd_pcm_uframes_t *)¶ms->buffer_size);
if (ret < 0) {
SNDERR("unable to set buffer size");
return ret;
if (params->period_time > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_period_time_near)(spcm,
- hw_params, (unsigned int *)¶ms->period_time, 0);
+ &hw_params, (unsigned int *)¶ms->period_time, 0);
if (ret < 0) {
SNDERR("unable to set period_time");
return ret;
}
} else if (params->period_size > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_period_size_near)(spcm,
- hw_params, (snd_pcm_uframes_t *)¶ms->period_size,
+ &hw_params, (snd_pcm_uframes_t *)¶ms->period_size,
0);
if (ret < 0) {
SNDERR("unable to set period_size");
if (buffer_is_not_initialized && params->periods > 0) {
unsigned int periods = params->periods;
ret = INTERNAL(snd_pcm_hw_params_set_periods_near)(spcm,
- hw_params, ¶ms->periods, 0);
+ &hw_params, ¶ms->periods, 0);
if (ret < 0) {
SNDERR("unable to set requested periods");
return ret;
}
}
- ret = snd_pcm_hw_params(spcm, hw_params);
+ ret = snd_pcm_hw_params(spcm, &hw_params);
if (ret < 0) {
SNDERR("unable to install hw params");
return ret;
/* store some hw_params values to shared info */
dmix->shmptr->hw.format =
- snd_mask_value(hw_param_mask(hw_params,
+ snd_mask_value(hw_param_mask(&hw_params,
SND_PCM_HW_PARAM_FORMAT));
dmix->shmptr->hw.rate =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_RATE);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_RATE);
dmix->shmptr->hw.buffer_size =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_BUFFER_SIZE);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_BUFFER_SIZE);
dmix->shmptr->hw.buffer_time =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_BUFFER_TIME);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_BUFFER_TIME);
dmix->shmptr->hw.period_size =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIOD_SIZE);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_PERIOD_SIZE);
dmix->shmptr->hw.period_time =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIOD_TIME);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_PERIOD_TIME);
dmix->shmptr->hw.periods =
- *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIODS);
+ *hw_param_interval(&hw_params, SND_PCM_HW_PARAM_PERIODS);
- ret = snd_pcm_sw_params_current(spcm, sw_params);
+ ret = snd_pcm_sw_params_current(spcm, &sw_params);
if (ret < 0) {
SNDERR("unable to get current sw_params");
return ret;
}
- ret = snd_pcm_sw_params_get_boundary(sw_params, &boundary);
+ ret = snd_pcm_sw_params_get_boundary(&sw_params, &boundary);
if (ret < 0) {
SNDERR("unable to get boundary");
return ret;
}
- ret = snd_pcm_sw_params_set_stop_threshold(spcm, sw_params, boundary);
+ ret = snd_pcm_sw_params_set_stop_threshold(spcm, &sw_params, boundary);
if (ret < 0) {
SNDERR("unable to set stop threshold");
return ret;
* the slave timestamp is copied appropriately in dsnoop/dmix/dshare
* based on the tstamp_mode of each client
*/
- ret = snd_pcm_sw_params_set_tstamp_mode(spcm, sw_params,
+ ret = snd_pcm_sw_params_set_tstamp_mode(spcm, &sw_params,
SND_PCM_TSTAMP_ENABLE);
if (ret < 0) {
SNDERR("unable to tstamp mode MMAP");
if (dmix->type != SND_PCM_TYPE_DMIX)
goto __skip_silencing;
- ret = snd_pcm_sw_params_set_silence_threshold(spcm, sw_params, 0);
+ ret = snd_pcm_sw_params_set_silence_threshold(spcm, &sw_params, 0);
if (ret < 0) {
SNDERR("unable to set silence threshold");
return ret;
}
- ret = snd_pcm_sw_params_set_silence_size(spcm, sw_params, boundary);
+ ret = snd_pcm_sw_params_set_silence_size(spcm, &sw_params, boundary);
if (ret < 0) {
SNDERR("unable to set silence threshold (please upgrade to 0.9.0rc8+ driver)");
return ret;
__skip_silencing:
- ret = snd_pcm_sw_params(spcm, sw_params);
+ ret = snd_pcm_sw_params(spcm, &sw_params);
if (ret < 0) {
SNDERR("unable to install sw params (please upgrade to 0.9.0rc8+ driver)");
return ret;