mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
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:
parent
7c27eda9fd
commit
65fd1de250
1 changed files with 30 additions and 33 deletions
|
|
@ -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)
|
||||
{
|
||||
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");
|
||||
|
|
@ -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)
|
||||
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[] = {
|
||||
|
|
@ -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) {
|
||||
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;
|
||||
|
|
@ -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) {
|
||||
/* 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");
|
||||
|
|
@ -981,13 +978,13 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
|
|||
}
|
||||
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");
|
||||
|
|
@ -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;
|
||||
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;
|
||||
|
|
@ -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) {
|
||||
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");
|
||||
|
|
@ -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) {
|
||||
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;
|
||||
|
|
@ -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) {
|
||||
SNDERR("unable to install hw params");
|
||||
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 */
|
||||
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;
|
||||
|
|
@ -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
|
||||
* 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");
|
||||
|
|
@ -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)
|
||||
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;
|
||||
|
|
@ -1120,7 +1117,7 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
|
|||
|
||||
__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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue