OSDN Git Service

PCM: Add the missing query_chmaps for route plugin
authorTakashi Iwai <tiwai@suse.de>
Wed, 12 Sep 2012 13:09:57 +0000 (15:09 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 13 Sep 2012 06:24:58 +0000 (08:24 +0200)
Also fix the channel count in get_chmap for route plugin.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_route.c

index 3f68f32..a5c5b04 100644 (file)
@@ -67,6 +67,7 @@ typedef struct {
        int use_getput;
        unsigned int src_size;
        snd_pcm_format_t dst_sfmt;
+       unsigned int nsrcs;
        unsigned int ndsts;
        snd_pcm_route_ttable_dst_t *dsts;
 } snd_pcm_route_params_t;
@@ -707,22 +708,23 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t *pcm)
 {
        snd_pcm_route_t *route = pcm->private_data;
        snd_pcm_chmap_t *map, *slave_map;
-       unsigned int src, dst;
+       unsigned int src, dst, nsrcs;
 
        slave_map = snd_pcm_generic_get_chmap(pcm);
        if (!slave_map)
                return NULL;
-       map = calloc(4, route->schannels + 1);
+       nsrcs = route->params.nsrcs;
+       map = calloc(4, nsrcs + 1);
        if (!map) {
                free(slave_map);
                return NULL;
        }
-       map->channels = route->schannels;
+       map->channels = nsrcs;
        for (dst = 0; dst < route->params.ndsts; dst++) {
                snd_pcm_route_ttable_dst_t *d = &route->params.dsts[dst];
                for (src = 0; src < d->nsrcs; src++) {
                        int c = d->srcs[src].channel;
-                       if (c < route->schannels && !map->pos[c])
+                       if (c < nsrcs && !map->pos[c])
                                map->pos[c] = slave_map->pos[dst];
                }
        }
@@ -730,6 +732,17 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t *pcm)
        return map;
 }
 
+static snd_pcm_chmap_query_t **snd_pcm_route_query_chmaps(snd_pcm_t *pcm)
+{
+       snd_pcm_chmap_query_t **maps;
+       snd_pcm_chmap_t *map = snd_pcm_route_get_chmap(pcm);
+       if (!map)
+               return NULL;
+       maps = _snd_pcm_make_single_query_chmaps(map);
+       free(map);
+       return maps;
+}
+
 static void snd_pcm_route_dump(snd_pcm_t *pcm, snd_output_t *out)
 {
        snd_pcm_route_t *route = pcm->private_data;
@@ -787,7 +800,7 @@ static const snd_pcm_ops_t snd_pcm_route_ops = {
        .async = snd_pcm_generic_async,
        .mmap = snd_pcm_generic_mmap,
        .munmap = snd_pcm_generic_munmap,
-       .query_chmaps = NULL, /* NYI */
+       .query_chmaps = snd_pcm_route_query_chmaps,
        .get_chmap = snd_pcm_route_get_chmap,
        .set_chmap = NULL, /* NYI */
 };
@@ -812,6 +825,7 @@ static int route_load_ttable(snd_pcm_route_params_t *params, snd_pcm_stream_t st
                dmul = tt_ssize;
        }
        params->ndsts = dused;
+       params->nsrcs = sused;
        dptr = calloc(dused, sizeof(*params->dsts));
        if (!dptr)
                return -ENOMEM;