pcm: remove alloca() from snd_pcm_direct_initialize_slave

Both of alloca() and automatic variables keeps storages on stack, while
the former generates more instructions than the latter. It's better to use
the latter if the size of storage is computable at pre-compile or compile
time; i.e. just for structures.

This commit obsolete usages of alloca() with automatic variables.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Sakamoto 2016-07-14 23:07:23 +09:00 committed by Takashi Iwai
parent 7c27eda9fd
commit 65fd1de250

View file

@ -913,30 +913,27 @@ static void save_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
*/ */
int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, struct slave_params *params) 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_hw_params_t hw_params = {0};
snd_pcm_sw_params_t *sw_params; snd_pcm_sw_params_t sw_params = {0};
int ret, buffer_is_not_initialized; int ret, buffer_is_not_initialized;
snd_pcm_uframes_t boundary; snd_pcm_uframes_t boundary;
struct pollfd fd; struct pollfd fd;
int loops = 10; int loops = 10;
snd_pcm_hw_params_alloca(&hw_params);
snd_pcm_sw_params_alloca(&sw_params);
__again: __again:
if (loops-- <= 0) { if (loops-- <= 0) {
SNDERR("unable to find a valid configuration for slave"); SNDERR("unable to find a valid configuration for slave");
return -EINVAL; return -EINVAL;
} }
ret = snd_pcm_hw_params_any(spcm, hw_params); ret = snd_pcm_hw_params_any(spcm, &hw_params);
if (ret < 0) { if (ret < 0) {
SNDERR("snd_pcm_hw_params_any failed"); SNDERR("snd_pcm_hw_params_any failed");
return ret; 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); SND_PCM_ACCESS_MMAP_INTERLEAVED);
if (ret < 0) { 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); SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
if (ret < 0) { if (ret < 0) {
SNDERR("slave plugin does not support mmap interleaved or mmap noninterleaved access"); SNDERR("slave plugin does not support mmap interleaved or mmap noninterleaved access");
@ -946,7 +943,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
if (params->format == SND_PCM_FORMAT_UNKNOWN) if (params->format == SND_PCM_FORMAT_UNKNOWN)
ret = -EINVAL; ret = -EINVAL;
else else
ret = snd_pcm_hw_params_set_format(spcm, hw_params, ret = snd_pcm_hw_params_set_format(spcm, &hw_params,
params->format); params->format);
if (ret < 0) { if (ret < 0) {
static const snd_pcm_format_t dmix_formats[] = { static const snd_pcm_format_t dmix_formats[] = {
@ -965,7 +962,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
for (i = 0; i < ARRAY_SIZE(dmix_formats); ++i) { for (i = 0; i < ARRAY_SIZE(dmix_formats); ++i) {
format = 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); format);
if (ret >= 0) if (ret >= 0)
break; break;
@ -973,7 +970,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
if (ret < 0 && dmix->type != SND_PCM_TYPE_DMIX) { if (ret < 0 && dmix->type != SND_PCM_TYPE_DMIX) {
/* TODO: try to choose a good format */ /* TODO: try to choose a good format */
ret = INTERNAL(snd_pcm_hw_params_set_format_first)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_format_first)(spcm,
hw_params, &format); &hw_params, &format);
} }
if (ret < 0) { if (ret < 0) {
SNDERR("requested or auto-format is not available"); SNDERR("requested or auto-format is not available");
@ -981,13 +978,13 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
} }
params->format = format; 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 *)&params->channels); (unsigned int *)&params->channels);
if (ret < 0) { if (ret < 0) {
SNDERR("requested count of channels is not available"); SNDERR("requested count of channels is not available");
return ret; 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 *)&params->rate, 0); (unsigned int *)&params->rate, 0);
if (ret < 0) { if (ret < 0) {
SNDERR("requested rate is not available"); SNDERR("requested rate is not available");
@ -997,14 +994,14 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
buffer_is_not_initialized = 0; buffer_is_not_initialized = 0;
if (params->buffer_time > 0) { if (params->buffer_time > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(spcm,
hw_params, (unsigned int *)&params->buffer_time, 0); &hw_params, (unsigned int *)&params->buffer_time, 0);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to set buffer time"); SNDERR("unable to set buffer time");
return ret; return ret;
} }
} else if (params->buffer_size > 0) { } else if (params->buffer_size > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(spcm,
hw_params, (snd_pcm_uframes_t *)&params->buffer_size); &hw_params, (snd_pcm_uframes_t *)&params->buffer_size);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to set buffer size"); SNDERR("unable to set buffer size");
return ret; return ret;
@ -1015,14 +1012,14 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
if (params->period_time > 0) { if (params->period_time > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_period_time_near)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_period_time_near)(spcm,
hw_params, (unsigned int *)&params->period_time, 0); &hw_params, (unsigned int *)&params->period_time, 0);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to set period_time"); SNDERR("unable to set period_time");
return ret; return ret;
} }
} else if (params->period_size > 0) { } else if (params->period_size > 0) {
ret = INTERNAL(snd_pcm_hw_params_set_period_size_near)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_period_size_near)(spcm,
hw_params, (snd_pcm_uframes_t *)&params->period_size, &hw_params, (snd_pcm_uframes_t *)&params->period_size,
0); 0);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to set period_size"); SNDERR("unable to set period_size");
@ -1033,7 +1030,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
if (buffer_is_not_initialized && params->periods > 0) { if (buffer_is_not_initialized && params->periods > 0) {
unsigned int periods = params->periods; unsigned int periods = params->periods;
ret = INTERNAL(snd_pcm_hw_params_set_periods_near)(spcm, ret = INTERNAL(snd_pcm_hw_params_set_periods_near)(spcm,
hw_params, &params->periods, 0); &hw_params, &params->periods, 0);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to set requested periods"); SNDERR("unable to set requested periods");
return ret; return ret;
@ -1052,7 +1049,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
} }
} }
ret = snd_pcm_hw_params(spcm, hw_params); ret = snd_pcm_hw_params(spcm, &hw_params);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to install hw params"); SNDERR("unable to install hw params");
return ret; return ret;
@ -1060,34 +1057,34 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
/* store some hw_params values to shared info */ /* store some hw_params values to shared info */
dmix->shmptr->hw.format = 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)); SND_PCM_HW_PARAM_FORMAT));
dmix->shmptr->hw.rate = 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 = 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 = 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 = 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 = 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 = 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) { if (ret < 0) {
SNDERR("unable to get current sw_params"); SNDERR("unable to get current sw_params");
return ret; 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) { if (ret < 0) {
SNDERR("unable to get boundary"); SNDERR("unable to get boundary");
return ret; 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) { if (ret < 0) {
SNDERR("unable to set stop threshold"); SNDERR("unable to set stop threshold");
return ret; return ret;
@ -1097,7 +1094,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
* the slave timestamp is copied appropriately in dsnoop/dmix/dshare * the slave timestamp is copied appropriately in dsnoop/dmix/dshare
* based on the tstamp_mode of each client * 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); SND_PCM_TSTAMP_ENABLE);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to tstamp mode MMAP"); SNDERR("unable to tstamp mode MMAP");
@ -1107,12 +1104,12 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
if (dmix->type != SND_PCM_TYPE_DMIX) if (dmix->type != SND_PCM_TYPE_DMIX)
goto __skip_silencing; 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) { if (ret < 0) {
SNDERR("unable to set silence threshold"); SNDERR("unable to set silence threshold");
return ret; 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) { if (ret < 0) {
SNDERR("unable to set silence threshold (please upgrade to 0.9.0rc8+ driver)"); SNDERR("unable to set silence threshold (please upgrade to 0.9.0rc8+ driver)");
return ret; return ret;
@ -1120,7 +1117,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
__skip_silencing: __skip_silencing:
ret = snd_pcm_sw_params(spcm, sw_params); ret = snd_pcm_sw_params(spcm, &sw_params);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to install sw params (please upgrade to 0.9.0rc8+ driver)"); SNDERR("unable to install sw params (please upgrade to 0.9.0rc8+ driver)");
return ret; return ret;