routing: explicit routing in module-murphy-ivi
[profile/ivi/pulseaudio-module-murphy-ivi.git] / murphy / router.h
1 #ifndef foomirrouterfoo
2 #define foomirrouterfoo
3
4 #include <sys/types.h>
5
6 #include "userdata.h"
7 #include "list.h"
8
9 typedef pa_bool_t (*mir_rtgroup_accept_t)(struct userdata *, mir_rtgroup *,
10                                           mir_node *);
11 typedef int       (*mir_rtgroup_compare_t)(struct userdata *u,
12                                            mir_node *, mir_node *);
13
14 struct pa_router {
15     pa_hashmap   *rtgroups;
16     int           maplen;     /**< length of the class- and priormap */
17     mir_rtgroup **classmap;   /**< to map device node types to rtgroups */
18     int          *priormap;   /**< stream node priorities */
19     mir_dlist     nodlist;    /**< priorized list of the input stream nodes */
20     mir_dlist     connlist;   /**< listhead of the connections */
21 };
22
23
24 struct mir_rtentry {
25     mir_dlist    link;        /**< rtgroup chain */
26     mir_dlist    nodchain;    /**< node chain */
27     mir_node    *node;        /**< pointer to the owning node */
28     bool         blocked;     /**< weather this routing entry is active */
29     uint32_t     stamp;
30 };
31
32 struct mir_rtgroup {
33     char                 *name;     /**< name of the rtgroup  */
34     mir_dlist             entries;  /**< listhead of ordered rtentries */
35     mir_rtgroup_accept_t  accept;   /**< wheter to accept a node or not */
36     mir_rtgroup_compare_t compare;  /**< comparision function for ordering */
37 };
38
39 struct mir_connection {
40     mir_dlist     link;     /**< list of connections */
41     pa_bool_t     blocked;  /**< true if this conflicts with another route */
42     uint16_t      amid;     /**< audio manager connection id */
43     uint32_t      from;     /**< source node index */
44     uint32_t      to;       /**< destination node index */
45     uint32_t      stream;   /**< index of the sink-input to be routed */
46 };
47
48
49 pa_router *pa_router_init(struct userdata *);
50 void pa_router_done(struct userdata *);
51
52 pa_bool_t mir_router_create_rtgroup(struct userdata *, const char *,
53                                     mir_rtgroup_accept_t,
54                                     mir_rtgroup_compare_t);
55 void mir_router_destroy_rtgroup(struct userdata *, const char *);
56 pa_bool_t mir_router_assign_class_to_rtgroup(struct userdata *, mir_node_type,
57                                              const char *);
58
59 void mir_router_register_node(struct userdata *, mir_node *);
60 void mir_router_unregister_node(struct userdata *, mir_node *);
61
62 mir_node *mir_router_make_prerouting(struct userdata *, mir_node *);
63 void mir_router_make_routing(struct userdata *);
64
65 mir_connection *mir_router_add_explicit_route(struct userdata *, uint16_t,
66                                               mir_node *, mir_node *);
67 void mir_router_remove_explicit_route(struct userdata *, mir_connection *);
68
69
70 int mir_router_print_rtgroups(struct userdata *, char *, int);
71
72 pa_bool_t mir_router_default_accept(struct userdata *, mir_rtgroup *,
73                                     mir_node *);
74 pa_bool_t mir_router_phone_accept(struct userdata *, mir_rtgroup *,
75                                   mir_node *);
76
77 int mir_router_default_compare(struct userdata *, mir_node *, mir_node *);
78 int mir_router_phone_compare(struct userdata *, mir_node *, mir_node *);
79
80
81 #endif  /* foomirrouterfoo */
82
83
84 /*
85  * Local Variables:
86  * c-basic-offset: 4
87  * indent-tabs-mode: nil
88  * End:
89  *
90  */