ALSA: firewire-tascam: code refactoring for reservation of isochronous resources
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 2 Jun 2019 07:12:46 +0000 (16:12 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 11 Jun 2019 09:36:18 +0000 (11:36 +0200)
This commit is a part of preparation to perform allocation/release
of isochronous channels in pcm.hw_params/hw_free callbacks.

This commit applies minor code refactoring for a helper function to
allocate isochronous resources.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/tascam/tascam-stream.c

index 7cddd9ece4eecb755938a9dd9788400ed769c16e..fc963469f6b033af50e931ae9148e000d8e33c50 100644 (file)
@@ -276,34 +276,24 @@ static void release_resources(struct snd_tscm *tscm)
        fw_iso_resources_free(&tscm->rx_resources);
 }
 
-static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
+static int keep_resources(struct snd_tscm *tscm, unsigned int rate,
+                         struct amdtp_stream *stream)
 {
+       struct fw_iso_resources *resources;
        int err;
 
-       /* Keep resources for in-stream. */
-       err = amdtp_tscm_set_parameters(&tscm->tx_stream, rate);
-       if (err < 0)
-               return err;
-       err = fw_iso_resources_allocate(&tscm->tx_resources,
-                       amdtp_stream_get_max_payload(&tscm->tx_stream),
-                       fw_parent_device(tscm->unit)->max_speed);
-       if (err < 0)
-               goto error;
+       if (stream == &tscm->tx_stream)
+               resources = &tscm->tx_resources;
+       else
+               resources = &tscm->rx_resources;
 
-       /* Keep resources for out-stream. */
-       err = amdtp_tscm_set_parameters(&tscm->rx_stream, rate);
-       if (err < 0)
-               return err;
-       err = fw_iso_resources_allocate(&tscm->rx_resources,
-                       amdtp_stream_get_max_payload(&tscm->rx_stream),
-                       fw_parent_device(tscm->unit)->max_speed);
+       err = amdtp_tscm_set_parameters(stream, rate);
        if (err < 0)
                return err;
 
-       return 0;
-error:
-       release_resources(tscm);
-       return err;
+       return fw_iso_resources_allocate(resources,
+                               amdtp_stream_get_max_payload(stream),
+                               fw_parent_device(tscm->unit)->max_speed);
 }
 
 int snd_tscm_stream_init_duplex(struct snd_tscm *tscm)
@@ -388,7 +378,11 @@ int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate)
        }
 
        if (!amdtp_stream_running(&tscm->rx_stream)) {
-               err = keep_resources(tscm, rate);
+               err = keep_resources(tscm, rate, &tscm->tx_stream);
+               if (err < 0)
+                       goto error;
+
+               err = keep_resources(tscm, rate, &tscm->rx_stream);
                if (err < 0)
                        goto error;