Commit e76bf3c4 authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: pcm/oss: refer to parameters instead of copying to reduce usage of kernel stack

Some functions in compatibility layer for Open Sound System interface has
local variable to copy some parameters in runtime of PCM substream, while
this can be replaced with reference of pointers to parameter itself. This
brings an advantage to reduce usage of kernel stack.

This commit applies this idea.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b55f9fdc
...@@ -848,7 +848,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream, ...@@ -848,7 +848,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream,
int direct; int direct;
snd_pcm_format_t format, sformat; snd_pcm_format_t format, sformat;
int n; int n;
struct snd_mask sformat_mask; const struct snd_mask *sformat_mask;
struct snd_mask mask; struct snd_mask mask;
if (trylock) { if (trylock) {
...@@ -891,18 +891,18 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream, ...@@ -891,18 +891,18 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream,
format = snd_pcm_oss_format_from(runtime->oss.format); format = snd_pcm_oss_format_from(runtime->oss.format);
sformat_mask = *hw_param_mask(sparams, SNDRV_PCM_HW_PARAM_FORMAT); sformat_mask = hw_param_mask_c(sparams, SNDRV_PCM_HW_PARAM_FORMAT);
if (direct) if (direct)
sformat = format; sformat = format;
else else
sformat = snd_pcm_plug_slave_format(format, &sformat_mask); sformat = snd_pcm_plug_slave_format(format, sformat_mask);
if ((__force int)sformat < 0 || if ((__force int)sformat < 0 ||
!snd_mask_test(&sformat_mask, (__force int)sformat)) { !snd_mask_test(sformat_mask, (__force int)sformat)) {
for (sformat = (__force snd_pcm_format_t)0; for (sformat = (__force snd_pcm_format_t)0;
(__force int)sformat <= (__force int)SNDRV_PCM_FORMAT_LAST; (__force int)sformat <= (__force int)SNDRV_PCM_FORMAT_LAST;
sformat = (__force snd_pcm_format_t)((__force int)sformat + 1)) { sformat = (__force snd_pcm_format_t)((__force int)sformat + 1)) {
if (snd_mask_test(&sformat_mask, (__force int)sformat) && if (snd_mask_test(sformat_mask, (__force int)sformat) &&
snd_pcm_oss_format_to(sformat) >= 0) snd_pcm_oss_format_to(sformat) >= 0)
break; break;
} }
...@@ -1780,7 +1780,7 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file) ...@@ -1780,7 +1780,7 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
int direct; int direct;
struct snd_pcm_hw_params *params; struct snd_pcm_hw_params *params;
unsigned int formats = 0; unsigned int formats = 0;
struct snd_mask format_mask; const struct snd_mask *format_mask;
int fmt; int fmt;
if ((err = snd_pcm_oss_get_active_substream(pcm_oss_file, &substream)) < 0) if ((err = snd_pcm_oss_get_active_substream(pcm_oss_file, &substream)) < 0)
...@@ -1802,12 +1802,12 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file) ...@@ -1802,12 +1802,12 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
return -ENOMEM; return -ENOMEM;
_snd_pcm_hw_params_any(params); _snd_pcm_hw_params_any(params);
err = snd_pcm_hw_refine(substream, params); err = snd_pcm_hw_refine(substream, params);
format_mask = *hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); format_mask = hw_param_mask_c(params, SNDRV_PCM_HW_PARAM_FORMAT);
kfree(params); kfree(params);
if (err < 0) if (err < 0)
return err; return err;
for (fmt = 0; fmt < 32; ++fmt) { for (fmt = 0; fmt < 32; ++fmt) {
if (snd_mask_test(&format_mask, fmt)) { if (snd_mask_test(format_mask, fmt)) {
int f = snd_pcm_oss_format_to(fmt); int f = snd_pcm_oss_format_to(fmt);
if (f >= 0) if (f >= 0)
formats |= f; formats |= f;
......
...@@ -266,7 +266,8 @@ snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pc ...@@ -266,7 +266,8 @@ snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pc
return frames; return frames;
} }
static int snd_pcm_plug_formats(struct snd_mask *mask, snd_pcm_format_t format) static int snd_pcm_plug_formats(const struct snd_mask *mask,
snd_pcm_format_t format)
{ {
struct snd_mask formats = *mask; struct snd_mask formats = *mask;
u64 linfmts = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 | u64 linfmts = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
...@@ -309,7 +310,7 @@ static snd_pcm_format_t preferred_formats[] = { ...@@ -309,7 +310,7 @@ static snd_pcm_format_t preferred_formats[] = {
}; };
snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format, snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format,
struct snd_mask *format_mask) const struct snd_mask *format_mask)
{ {
int i; int i;
......
...@@ -126,7 +126,7 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *substream, ...@@ -126,7 +126,7 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *slave_params); struct snd_pcm_hw_params *slave_params);
snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format, snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format,
struct snd_mask *format_mask); const struct snd_mask *format_mask);
int snd_pcm_plugin_append(struct snd_pcm_plugin *plugin); int snd_pcm_plugin_append(struct snd_pcm_plugin *plugin);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment