ALSA: pcm: oss: Simplify plugin frame size calculations
authorTakashi Iwai <tiwai@suse.de>
Mon, 9 Mar 2020 18:58:55 +0000 (19:58 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 Mar 2020 19:02:42 +0000 (20:02 +0100)
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>
sound/core/oss/pcm_plugin.c

index c940183..58642fe 100644 (file)
@@ -196,82 +196,74 @@ int snd_pcm_plugin_free(struct snd_pcm_plugin *plugin)
        return 0;
 }
 
-snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, snd_pcm_uframes_t drv_frames)
+static snd_pcm_sframes_t calc_dst_frames(struct snd_pcm_substream *plug,
+                                        snd_pcm_sframes_t frames)
 {
-       struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next;
-       int stream;
+       struct snd_pcm_plugin *plugin, *plugin_next;
 
-       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;
+       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;
                }
-       } 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;
+               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;
                }
-       } else
+               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)
+{
+       if (snd_BUG_ON(!plug))
+               return -ENXIO;
+       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,