scripting: support for zone based routing in application classes
[profile/ivi/pulseaudio-module-murphy-ivi.git] / murphy / router.h
1 /*
2  * module-murphy-ivi -- PulseAudio module for providing audio routing support
3  * Copyright (c) 2012, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU Lesser General Public License,
7  * version 2.1, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.
12  * See the GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston,
17  * MA 02110-1301 USA.
18  *
19  */
20 #ifndef foomirrouterfoo
21 #define foomirrouterfoo
22
23 #include <sys/types.h>
24
25 #include "userdata.h"
26 #include "list.h"
27
28 typedef pa_bool_t (*mir_rtgroup_accept_t)(struct userdata *, mir_rtgroup *,
29                                           mir_node *);
30 typedef int       (*mir_rtgroup_compare_t)(struct userdata *, mir_rtgroup *,
31                                            mir_node *, mir_node *);
32
33 typedef struct {
34     pa_hashmap *input;
35     pa_hashmap *output;
36 } pa_rtgroup_hash;
37
38 typedef struct {
39     mir_rtgroup **input;
40     mir_rtgroup **output;
41 } pa_rtgroup_classmap;
42
43 struct pa_router {
44     pa_rtgroup_hash      rtgroups;
45     int                  maplen;   /**< length of the class- and priormap */
46     pa_rtgroup_classmap  classmap; /**< to map device node types to rtgroups */
47     int                 *priormap; /**< stream node priorities */
48     mir_dlist            nodlist;  /**< priorized list of the stream nodes
49                                         (entry in node: rtprilist) */
50     mir_dlist            connlist; /**< listhead of the connections */
51 };
52
53
54 struct mir_rtentry {
55     mir_dlist    link;        /**< rtgroup chain */
56     mir_dlist    nodchain;    /**< node chain */
57     mir_rtgroup *group;       /**< back pointer to the group  */
58     mir_node    *node;        /**< pointer to the owning node */
59     bool         blocked;     /**< weather this routing entry is active */
60     uint32_t     stamp;
61 };
62
63 struct mir_rtgroup {
64     char                  *name;      /**< name of the rtgroup */
65     mir_dlist              entries;   /**< listhead of ordered rtentries */
66     mir_rtgroup_accept_t   accept;    /**< wheter to accept a node or not */
67     mir_rtgroup_compare_t  compare;   /**< comparision function for ordering */
68     scripting_rtgroup     *scripting; /**< data for scripting, if any */
69 };
70
71 struct mir_connection {
72     mir_dlist     link;     /**< list of connections */
73     pa_bool_t     blocked;  /**< true if this conflicts with another route */
74     uint16_t      amid;     /**< audio manager connection id */
75     uint32_t      from;     /**< source node index */
76     uint32_t      to;       /**< destination node index */
77     uint32_t      stream;   /**< index of the sink-input to be routed */
78 };
79
80
81 pa_router *pa_router_init(struct userdata *);
82 void pa_router_done(struct userdata *);
83
84 void mir_router_assign_class_priority(struct userdata *, mir_node_type, int);
85
86 mir_rtgroup *mir_router_create_rtgroup(struct userdata *,
87                                        mir_direction, const char *,
88                                        mir_rtgroup_accept_t,
89                                        mir_rtgroup_compare_t);
90 void mir_router_destroy_rtgroup(struct userdata *, mir_direction,
91                                 const char *);
92 pa_bool_t mir_router_assign_class_to_rtgroup(struct userdata *, mir_node_type,
93                                              mir_direction,  const char *);
94
95 void mir_router_register_node(struct userdata *, mir_node *);
96 void mir_router_unregister_node(struct userdata *, mir_node *);
97
98 mir_node *mir_router_make_prerouting(struct userdata *, mir_node *);
99 void mir_router_make_routing(struct userdata *);
100
101 mir_connection *mir_router_add_explicit_route(struct userdata *, uint16_t,
102                                               mir_node *, mir_node *);
103 void mir_router_remove_explicit_route(struct userdata *, mir_connection *);
104
105
106 int mir_router_print_rtgroups(struct userdata *, char *, int);
107
108 pa_bool_t mir_router_default_accept(struct userdata *, mir_rtgroup *,
109                                     mir_node *);
110 pa_bool_t mir_router_phone_accept(struct userdata *, mir_rtgroup *,
111                                   mir_node *);
112
113 int mir_router_default_compare(struct userdata *, mir_rtgroup *,
114                                mir_node *, mir_node *);
115 int mir_router_phone_compare(struct userdata *, mir_rtgroup *,
116                              mir_node *, mir_node *);
117
118
119 #endif  /* foomirrouterfoo */
120
121
122 /*
123  * Local Variables:
124  * c-basic-offset: 4
125  * indent-tabs-mode: nil
126  * End:
127  *
128  */