2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
30 #include <pulse/xmalloc.h>
32 #include <pulsecore/module.h>
33 #include <pulsecore/memchunk.h>
34 #include <pulsecore/sound-file.h>
35 #include <pulsecore/log.h>
36 #include <pulsecore/macro.h>
37 #include <pulsecore/core-scache.h>
38 #include <pulsecore/core-subscribe.h>
42 static void entry_free(pa_autoload_entry
*e
) {
44 pa_subscription_post(e
->core
, PA_SUBSCRIPTION_EVENT_AUTOLOAD
|PA_SUBSCRIPTION_EVENT_REMOVE
, PA_INVALID_INDEX
);
47 pa_xfree(e
->argument
);
51 static void entry_remove_and_free(pa_autoload_entry
*e
) {
55 pa_idxset_remove_by_data(e
->core
->autoload_idxset
, e
, NULL
);
56 pa_hashmap_remove(e
->core
->autoload_hashmap
, e
->name
);
60 static pa_autoload_entry
* entry_new(pa_core
*c
, const char *name
) {
61 pa_autoload_entry
*e
= NULL
;
63 pa_core_assert_ref(c
);
66 if (c
->autoload_hashmap
&& (e
= pa_hashmap_get(c
->autoload_hashmap
, name
)))
69 e
= pa_xnew(pa_autoload_entry
, 1);
71 e
->name
= pa_xstrdup(name
);
72 e
->module
= e
->argument
= NULL
;
75 if (!c
->autoload_hashmap
)
76 c
->autoload_hashmap
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
77 pa_assert(c
->autoload_hashmap
);
79 pa_hashmap_put(c
->autoload_hashmap
, e
->name
, e
);
81 if (!c
->autoload_idxset
)
82 c
->autoload_idxset
= pa_idxset_new(pa_idxset_trivial_hash_func
, pa_idxset_trivial_compare_func
);
83 pa_idxset_put(c
->autoload_idxset
, e
, &e
->index
);
85 pa_subscription_post(c
, PA_SUBSCRIPTION_EVENT_AUTOLOAD
|PA_SUBSCRIPTION_EVENT_NEW
, e
->index
);
90 int pa_autoload_add(pa_core
*c
, const char*name
, pa_namereg_type_t type
, const char*module
, const char *argument
, uint32_t *idx
) {
91 pa_autoload_entry
*e
= NULL
;
96 pa_assert(type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
);
98 if (!(e
= entry_new(c
, name
)))
101 e
->module
= pa_xstrdup(module
);
102 e
->argument
= pa_xstrdup(argument
);
111 int pa_autoload_remove_by_name(pa_core
*c
, const char*name
, pa_namereg_type_t type
) {
112 pa_autoload_entry
*e
;
116 pa_assert(type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
);
118 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || e
->type
!= type
)
121 entry_remove_and_free(e
);
125 int pa_autoload_remove_by_index(pa_core
*c
, uint32_t idx
) {
126 pa_autoload_entry
*e
;
129 pa_assert(idx
!= PA_IDXSET_INVALID
);
131 if (!c
->autoload_idxset
|| !(e
= pa_idxset_get_by_index(c
->autoload_idxset
, idx
)))
134 entry_remove_and_free(e
);
138 void pa_autoload_request(pa_core
*c
, const char *name
, pa_namereg_type_t type
) {
139 pa_autoload_entry
*e
;
145 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || (e
->type
!= type
))
153 if (type
== PA_NAMEREG_SINK
|| type
== PA_NAMEREG_SOURCE
) {
154 if ((m
= pa_module_load(c
, e
->module
, e
->argument
)))
161 static void free_func(void *p
, PA_GCC_UNUSED
void *userdata
) {
162 pa_autoload_entry
*e
= p
;
163 pa_idxset_remove_by_data(e
->core
->autoload_idxset
, e
, NULL
);
167 void pa_autoload_free(pa_core
*c
) {
169 if (c
->autoload_hashmap
) {
170 pa_hashmap_free(c
->autoload_hashmap
, free_func
, NULL
);
171 c
->autoload_hashmap
= NULL
;
174 if (c
->autoload_idxset
) {
175 pa_idxset_free(c
->autoload_idxset
, NULL
, NULL
);
176 c
->autoload_idxset
= NULL
;
180 const pa_autoload_entry
* pa_autoload_get_by_name(pa_core
*c
, const char*name
, pa_namereg_type_t type
) {
181 pa_autoload_entry
*e
;
183 pa_core_assert_ref(c
);
186 if (!c
->autoload_hashmap
|| !(e
= pa_hashmap_get(c
->autoload_hashmap
, name
)) || e
->type
!= type
)
192 const pa_autoload_entry
* pa_autoload_get_by_index(pa_core
*c
, uint32_t idx
) {
193 pa_autoload_entry
*e
;
195 pa_core_assert_ref(c
);
196 pa_assert(idx
!= PA_IDXSET_INVALID
);
198 if (!c
->autoload_idxset
|| !(e
= pa_idxset_get_by_index(c
->autoload_idxset
, idx
)))