]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm:plug: save converter config
authorAndreas Pape <apape@de.adit-jv.com>
Tue, 21 Mar 2017 12:58:18 +0000 (18:28 +0530)
committerTakashi Iwai <tiwai@suse.de>
Tue, 21 Mar 2017 15:38:12 +0000 (16:38 +0100)
Passed config is freed after call to open, thus it is invalid when
trying to extract the converter name. So config entry is saved
for later usage.

Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Mounesh Sutar <sutar.mounesh@gmail.com>
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_plug.c

index 266707b425c19bc7c9ec8508765ef522317ed81f..e4c684de39985ca5e8845ea4df1e789a992d4159 100644 (file)
@@ -50,7 +50,7 @@ typedef struct {
        snd_pcm_format_t sformat;
        int schannels;
        int srate;
-       const snd_config_t *rate_converter;
+       snd_config_t *rate_converter;
        enum snd_pcm_plug_route_policy route_policy;
        snd_pcm_route_ttable_entry_t *ttable;
        int ttable_ok;
@@ -64,6 +64,10 @@ static int snd_pcm_plug_close(snd_pcm_t *pcm)
        snd_pcm_plug_t *plug = pcm->private_data;
        int err, result = 0;
        free(plug->ttable);
+       if (plug->rate_converter) {
+               snd_config_delete(plug->rate_converter);
+               plug->rate_converter = NULL;
+       }
        assert(plug->gen.slave == plug->req_slave);
        if (plug->gen.close_slave) {
                snd_pcm_unlink_hw_ptr(pcm, plug->req_slave);
@@ -1108,7 +1112,6 @@ int snd_pcm_plug_open(snd_pcm_t **pcmp,
        plug->sformat = sformat;
        plug->schannels = schannels;
        plug->srate = srate;
-       plug->rate_converter = rate_converter;
        plug->gen.slave = plug->req_slave = slave;
        plug->gen.close_slave = close_slave;
        plug->route_policy = route_policy;
@@ -1125,6 +1128,15 @@ int snd_pcm_plug_open(snd_pcm_t **pcmp,
        pcm->ops = &snd_pcm_plug_ops;
        pcm->fast_ops = slave->fast_ops;
        pcm->fast_op_arg = slave->fast_op_arg;
+       if (rate_converter) {
+               err = snd_config_copy(&plug->rate_converter,
+                                     (snd_config_t *)rate_converter);
+               if (err < 0) {
+                       snd_pcm_free(pcm);
+                       free(plug);
+                       return err;
+               }
+       }
        pcm->private_data = plug;
        pcm->poll_fd = slave->poll_fd;
        pcm->poll_events = slave->poll_events;