4 This file is part of PulseAudio.
6 Copyright 2004-2006 Lennart Poettering
7 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published
11 by the Free Software Foundation; either version 2 of the License,
12 or (at your option) any later version.
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
32 #include <pulse/xmalloc.h>
34 #include <pulsecore/module.h>
35 #include <pulsecore/memchunk.h>
36 #include <pulsecore/sound-file.h>
37 #include <pulsecore/log.h>
38 #include <pulsecore/macro.h>
39 #include <pulsecore/core-scache.h>
40 #include <pulsecore/core-subscribe.h>
44 static void entry_free(pa_autoload_entry
*e
) {
46 pa_subscription_post(e
->core
, PA_SUBSCRIPTION_EVENT_AUTOLOAD
|PA_SUBSCRIPTION_EVENT_REMOVE
, PA_INVALID_INDEX
);
49 pa_xfree(e
->argument
);
53 static void entry_remove_and_free(pa_autoload_entry
*e
) {
57 pa_idxset_remove_by_data(e
->core
->autoload_idxset
, e
, NULL
);
58 pa_hashmap_remove(e
->core
->autoload_hashmap
, e
->name
);
62 static pa_autoload_entry
* entry_new(pa_core
*c
, const char *name
) {
63 pa_autoload_entry
*e
= NULL
;
65 pa_core_assert_ref(c
);
68 if (c
->autoload_hashmap
&& (e
= pa_hashmap_get(c
->autoload_hashmap
, name
)))
71 e
= pa_xnew(pa_autoload_entry
, 1);
73 e
->name
= pa_xstrdup(name
);
74 e
->module
= e
->argument
= NULL
;
77 if (!c
->autoload_hashmap
)
78 c
->autoload_hashmap
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
79 pa_assert(c
->autoload_hashmap
);
81 pa_hashmap_put(c
->autoload_hashmap
, e
->name
, e
);
83 if (!c
->autoload_idxset
)
84 c
->autoload_idxset
= pa_idxset_new(pa_idxset_trivial_hash_func
, pa_idxset_trivial_compare_func
);
85 pa_idxset_put(c
->autoload_idxset
, e
, &e
->index
);
87 pa_subscription_post(c
, PA_SUBSCRIPTION_EVENT_AUTOLOAD
|PA_SUBSCRIPTION_EVENT_NEW
, e
->index
);
92 int pa_autoload_add(pa_core
*c
, const char*name
, pa_namereg_type_t type
, const char*module
, const char *argument
, uint32_t *idx
) {
93 pa_autoload_entry
*e
= NULL
;
98 pa_assert(type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
);
100 if (!(e
= entry_new(c
, name
)))
103 e
->module
= pa_xstrdup(module
);
104 e
->argument
= pa_xstrdup(argument
);
113 int pa_autoload_remove_by_name(pa_core
*c
, const char*name
, pa_namereg_type_t type
) {
114 pa_autoload_entry
*e
;
118 pa_assert(type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
);
120 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || e
->type
!= type
)
123 entry_remove_and_free(e
);
127 int pa_autoload_remove_by_index(pa_core
*c
, uint32_t idx
) {
128 pa_autoload_entry
*e
;
131 pa_assert(idx
!= PA_IDXSET_INVALID
);
133 if (!c
->autoload_idxset
|| !(e
= pa_idxset_get_by_index(c
->autoload_idxset
, idx
)))
136 entry_remove_and_free(e
);
140 void pa_autoload_request(pa_core
*c
, const char *name
, pa_namereg_type_t type
) {
141 pa_autoload_entry
*e
;
147 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || (e
->type
!= type
))
155 if (type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
) {
156 if ((m
= pa_module_load(c
, e
->module
, e
->argument
)))
163 static void free_func(void *p
, PA_GCC_UNUSED
void *userdata
) {
164 pa_autoload_entry
*e
= p
;
165 pa_idxset_remove_by_data(e
->core
->autoload_idxset
, e
, NULL
);
169 void pa_autoload_free(pa_core
*c
) {
171 if (c
->autoload_hashmap
) {
172 pa_hashmap_free(c
->autoload_hashmap
, free_func
, NULL
);
173 c
->autoload_hashmap
= NULL
;
176 if (c
->autoload_idxset
) {
177 pa_idxset_free(c
->autoload_idxset
, NULL
, NULL
);
178 c
->autoload_idxset
= NULL
;
182 const pa_autoload_entry
* pa_autoload_get_by_name(pa_core
*c
, const char*name
, pa_namereg_type_t type
) {
183 pa_autoload_entry
*e
;
185 pa_core_assert_ref(c
);
188 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || e
->type
!= type
)
194 const pa_autoload_entry
* pa_autoload_get_by_index(pa_core
*c
, uint32_t idx
) {
195 pa_autoload_entry
*e
;
197 pa_core_assert_ref(c
);
198 pa_assert(idx
!= PA_IDXSET_INVALID
);
200 if (!c
->autoload_idxset
|| !(e
= pa_idxset_get_by_index(c
->autoload_idxset
, idx
)))