mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 12:44:11 +08:00
ALSA: pcm: oss: Simplify plugin frame size calculations
Both snd_pcm_plug_client_size() and snd_pcm_plug_slave_size() do the almost same calculations of calling src_frames() and dst_frames() in the chain, but just to the different directions with each other. This patch simplifies those functions. Now they return -EINVAL for the invalid direction, but practically seen, there is no functional changes at all. Link: https://lore.kernel.org/r/20200309185855.15693-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
cf4afed90c
commit
3bbf9e2f86
@ -196,82 +196,74 @@ int snd_pcm_plugin_free(struct snd_pcm_plugin *plugin)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static snd_pcm_sframes_t calc_dst_frames(struct snd_pcm_substream *plug,
|
||||
snd_pcm_sframes_t frames)
|
||||
{
|
||||
struct snd_pcm_plugin *plugin, *plugin_next;
|
||||
|
||||
plugin = snd_pcm_plug_first(plug);
|
||||
while (plugin && frames > 0) {
|
||||
plugin_next = plugin->next;
|
||||
if (plugin->dst_frames) {
|
||||
frames = plugin->dst_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
if (frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin = plugin_next;
|
||||
}
|
||||
return frames;
|
||||
}
|
||||
|
||||
static snd_pcm_sframes_t calc_src_frames(struct snd_pcm_substream *plug,
|
||||
snd_pcm_sframes_t frames)
|
||||
{
|
||||
struct snd_pcm_plugin *plugin, *plugin_prev;
|
||||
|
||||
plugin = snd_pcm_plug_last(plug);
|
||||
while (plugin && frames > 0) {
|
||||
if (frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin_prev = plugin->prev;
|
||||
if (plugin->src_frames) {
|
||||
frames = plugin->src_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
plugin = plugin_prev;
|
||||
}
|
||||
return frames;
|
||||
}
|
||||
|
||||
snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, snd_pcm_uframes_t drv_frames)
|
||||
{
|
||||
struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next;
|
||||
int stream;
|
||||
|
||||
if (snd_BUG_ON(!plug))
|
||||
return -ENXIO;
|
||||
if (drv_frames == 0)
|
||||
return 0;
|
||||
stream = snd_pcm_plug_stream(plug);
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
plugin = snd_pcm_plug_last(plug);
|
||||
while (plugin && drv_frames > 0) {
|
||||
if (drv_frames > plugin->buf_frames)
|
||||
drv_frames = plugin->buf_frames;
|
||||
plugin_prev = plugin->prev;
|
||||
if (plugin->src_frames)
|
||||
drv_frames = plugin->src_frames(plugin, drv_frames);
|
||||
plugin = plugin_prev;
|
||||
}
|
||||
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
plugin = snd_pcm_plug_first(plug);
|
||||
while (plugin && drv_frames > 0) {
|
||||
plugin_next = plugin->next;
|
||||
if (plugin->dst_frames)
|
||||
drv_frames = plugin->dst_frames(plugin, drv_frames);
|
||||
if (drv_frames > plugin->buf_frames)
|
||||
drv_frames = plugin->buf_frames;
|
||||
plugin = plugin_next;
|
||||
}
|
||||
} else
|
||||
switch (snd_pcm_plug_stream(plug)) {
|
||||
case SNDRV_PCM_STREAM_PLAYBACK:
|
||||
return calc_src_frames(plug, drv_frames);
|
||||
case SNDRV_PCM_STREAM_CAPTURE:
|
||||
return calc_dst_frames(plug, drv_frames);
|
||||
default:
|
||||
snd_BUG();
|
||||
return drv_frames;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pcm_uframes_t clt_frames)
|
||||
{
|
||||
struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next;
|
||||
snd_pcm_sframes_t frames;
|
||||
int stream;
|
||||
|
||||
if (snd_BUG_ON(!plug))
|
||||
return -ENXIO;
|
||||
if (clt_frames == 0)
|
||||
return 0;
|
||||
frames = clt_frames;
|
||||
stream = snd_pcm_plug_stream(plug);
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
plugin = snd_pcm_plug_first(plug);
|
||||
while (plugin && frames > 0) {
|
||||
plugin_next = plugin->next;
|
||||
if (plugin->dst_frames) {
|
||||
frames = plugin->dst_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
if (frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin = plugin_next;
|
||||
}
|
||||
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
plugin = snd_pcm_plug_last(plug);
|
||||
while (plugin) {
|
||||
if (frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin_prev = plugin->prev;
|
||||
if (plugin->src_frames) {
|
||||
frames = plugin->src_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
plugin = plugin_prev;
|
||||
}
|
||||
} else
|
||||
switch (snd_pcm_plug_stream(plug)) {
|
||||
case SNDRV_PCM_STREAM_PLAYBACK:
|
||||
return calc_dst_frames(plug, clt_frames);
|
||||
case SNDRV_PCM_STREAM_CAPTURE:
|
||||
return calc_src_frames(plug, clt_frames);
|
||||
default:
|
||||
snd_BUG();
|
||||
return frames;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int snd_pcm_plug_formats(const struct snd_mask *mask,
|
||||
|
Loading…
Reference in New Issue
Block a user