VirtualBox

source: vbox/trunk/src/VBox/Devices/Audio/pulse_stubs.c@ 74067

Last change on this file since 74067 was 73462, checked in by vboxsync, 6 years ago

Audio/PulseAudio: Log the used library version on initialization.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
Line 
1/* $Id: pulse_stubs.c 73462 2018-08-03 08:15:08Z vboxsync $ */
2/** @file
3 * Stubs for libpulse.
4 */
5
6/*
7 * Copyright (C) 2006-2018 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#define LOG_GROUP LOG_GROUP_DRV_HOST_AUDIO
19#include <iprt/assert.h>
20#include <iprt/ldr.h>
21#include <VBox/log.h>
22#include <VBox/err.h>
23
24#include <pulse/pulseaudio.h>
25
26#include "pulse_stubs.h"
27
28#define VBOX_PULSE_LIB "libpulse.so.0"
29
30#define PROXY_STUB(function, rettype, signature, shortsig) \
31 static rettype (*g_pfn_ ## function) signature; \
32 \
33 rettype VBox_##function signature; \
34 rettype VBox_##function signature \
35 { \
36 return g_pfn_ ## function shortsig; \
37 }
38
39#define PROXY_STUB_VOID(function, signature, shortsig) \
40 static void (*g_pfn_ ## function) signature; \
41 \
42 void VBox_##function signature; \
43 void VBox_##function signature \
44 { \
45 g_pfn_ ## function shortsig; \
46 }
47
48PROXY_STUB (pa_bytes_per_second, size_t,
49 (const pa_sample_spec *spec),
50 (spec))
51PROXY_STUB (pa_bytes_to_usec, pa_usec_t,
52 (uint64_t l, const pa_sample_spec *spec),
53 (l, spec))
54PROXY_STUB (pa_channel_map_init_auto, pa_channel_map*,
55 (pa_channel_map *m, unsigned channels, pa_channel_map_def_t def),
56 (m, channels, def))
57
58PROXY_STUB (pa_context_connect, int,
59 (pa_context *c, const char *server, pa_context_flags_t flags,
60 const pa_spawn_api *api),
61 (c, server, flags, api))
62PROXY_STUB_VOID(pa_context_disconnect,
63 (pa_context *c),
64 (c))
65PROXY_STUB (pa_context_get_server_info, pa_operation*,
66 (pa_context *c, pa_server_info_cb_t cb, void *userdata),
67 (c, cb, userdata))
68PROXY_STUB (pa_context_get_sink_info_by_name, pa_operation*,
69 (pa_context *c, const char *name, pa_sink_info_cb_t cb, void *userdata),
70 (c, name, cb, userdata))
71PROXY_STUB (pa_context_get_source_info_by_name, pa_operation*,
72 (pa_context *c, const char *name, pa_source_info_cb_t cb, void *userdata),
73 (c, name, cb, userdata))
74PROXY_STUB (pa_context_get_state, pa_context_state_t,
75 (pa_context *c),
76 (c))
77PROXY_STUB_VOID(pa_context_unref,
78 (pa_context *c),
79 (c))
80PROXY_STUB (pa_context_errno, int,
81 (pa_context *c),
82 (c))
83PROXY_STUB (pa_context_new, pa_context*,
84 (pa_mainloop_api *mainloop, const char *name),
85 (mainloop, name))
86PROXY_STUB_VOID(pa_context_set_state_callback,
87 (pa_context *c, pa_context_notify_cb_t cb, void *userdata),
88 (c, cb, userdata))
89
90PROXY_STUB (pa_frame_size, size_t,
91 (const pa_sample_spec *spec),
92 (spec))
93PROXY_STUB (pa_get_library_version, const char *, (void), ())
94PROXY_STUB_VOID(pa_operation_unref,
95 (pa_operation *o),
96 (o))
97PROXY_STUB (pa_operation_get_state, pa_operation_state_t,
98 (pa_operation *o),
99 (o))
100PROXY_STUB_VOID(pa_operation_cancel,
101 (pa_operation *o),
102 (o))
103
104PROXY_STUB (pa_rtclock_now, pa_usec_t,
105 (void),
106 ())
107PROXY_STUB (pa_sample_format_to_string, const char*,
108 (pa_sample_format_t f),
109 (f))
110PROXY_STUB (pa_sample_spec_valid, int,
111 (const pa_sample_spec *spec),
112 (spec))
113PROXY_STUB (pa_strerror, const char*,
114 (int error),
115 (error))
116
117#if PA_PROTOCOL_VERSION >= 16
118PROXY_STUB (pa_stream_connect_playback, int,
119 (pa_stream *s, const char *dev, const pa_buffer_attr *attr,
120 pa_stream_flags_t flags, const pa_cvolume *volume, pa_stream *sync_stream),
121 (s, dev, attr, flags, volume, sync_stream))
122#else
123PROXY_STUB (pa_stream_connect_playback, int,
124 (pa_stream *s, const char *dev, const pa_buffer_attr *attr,
125 pa_stream_flags_t flags, pa_cvolume *volume, pa_stream *sync_stream),
126 (s, dev, attr, flags, volume, sync_stream))
127#endif
128PROXY_STUB (pa_stream_connect_record, int,
129 (pa_stream *s, const char *dev, const pa_buffer_attr *attr,
130 pa_stream_flags_t flags),
131 (s, dev, attr, flags))
132PROXY_STUB (pa_stream_disconnect, int,
133 (pa_stream *s),
134 (s))
135PROXY_STUB (pa_stream_get_sample_spec, const pa_sample_spec*,
136 (pa_stream *s),
137 (s))
138PROXY_STUB_VOID(pa_stream_set_latency_update_callback,
139 (pa_stream *p, pa_stream_notify_cb_t cb, void *userdata),
140 (p, cb, userdata))
141PROXY_STUB (pa_stream_write, int,
142 (pa_stream *p, const void *data, size_t bytes, pa_free_cb_t free_cb,
143 int64_t offset, pa_seek_mode_t seek),
144 (p, data, bytes, free_cb, offset, seek))
145PROXY_STUB_VOID(pa_stream_unref,
146 (pa_stream *s),
147 (s))
148PROXY_STUB (pa_stream_get_state, pa_stream_state_t,
149 (pa_stream *p),
150 (p))
151PROXY_STUB (pa_stream_get_latency, int,
152 (pa_stream *s, pa_usec_t *r_usec, int *negative),
153 (s, r_usec, negative))
154PROXY_STUB (pa_stream_get_timing_info, pa_timing_info*,
155 (pa_stream *s),
156 (s))
157PROXY_STUB (pa_stream_readable_size, size_t,
158 (pa_stream *p),
159 (p))
160PROXY_STUB (pa_stream_set_buffer_attr, pa_operation *,
161 (pa_stream *s, const pa_buffer_attr *attr, pa_stream_success_cb_t cb, void *userdata),
162 (s, attr, cb, userdata))
163PROXY_STUB_VOID(pa_stream_set_state_callback,
164 (pa_stream *s, pa_stream_notify_cb_t cb, void *userdata),
165 (s, cb, userdata))
166PROXY_STUB_VOID(pa_stream_set_underflow_callback,
167 (pa_stream *s, pa_stream_notify_cb_t cb, void *userdata),
168 (s, cb, userdata))
169PROXY_STUB_VOID(pa_stream_set_overflow_callback,
170 (pa_stream *s, pa_stream_notify_cb_t cb, void *userdata),
171 (s, cb, userdata))
172PROXY_STUB_VOID(pa_stream_set_write_callback,
173 (pa_stream *s, pa_stream_request_cb_t cb, void *userdata),
174 (s, cb, userdata))
175PROXY_STUB (pa_stream_flush, pa_operation*,
176 (pa_stream *s, pa_stream_success_cb_t cb, void *userdata),
177 (s, cb, userdata))
178PROXY_STUB (pa_stream_drain, pa_operation*,
179 (pa_stream *s, pa_stream_success_cb_t cb, void *userdata),
180 (s, cb, userdata))
181PROXY_STUB (pa_stream_trigger, pa_operation*,
182 (pa_stream *s, pa_stream_success_cb_t cb, void *userdata),
183 (s, cb, userdata))
184PROXY_STUB (pa_stream_new, pa_stream*,
185 (pa_context *c, const char *name, const pa_sample_spec *ss,
186 const pa_channel_map *map),
187 (c, name, ss, map))
188PROXY_STUB (pa_stream_get_buffer_attr, const pa_buffer_attr*,
189 (pa_stream *s),
190 (s))
191PROXY_STUB (pa_stream_peek, int,
192 (pa_stream *p, const void **data, size_t *bytes),
193 (p, data, bytes))
194PROXY_STUB (pa_stream_cork, pa_operation*,
195 (pa_stream *s, int b, pa_stream_success_cb_t cb, void *userdata),
196 (s, b, cb, userdata))
197PROXY_STUB (pa_stream_drop, int,
198 (pa_stream *p),
199 (p))
200PROXY_STUB (pa_stream_writable_size, size_t,
201 (pa_stream *p),
202 (p))
203
204PROXY_STUB_VOID(pa_threaded_mainloop_stop,
205 (pa_threaded_mainloop *m),
206 (m))
207PROXY_STUB (pa_threaded_mainloop_get_api, pa_mainloop_api*,
208 (pa_threaded_mainloop *m),
209 (m))
210PROXY_STUB_VOID(pa_threaded_mainloop_free,
211 (pa_threaded_mainloop* m),
212 (m))
213PROXY_STUB_VOID(pa_threaded_mainloop_signal,
214 (pa_threaded_mainloop *m, int wait_for_accept),
215 (m, wait_for_accept))
216PROXY_STUB_VOID(pa_threaded_mainloop_unlock,
217 (pa_threaded_mainloop *m),
218 (m))
219PROXY_STUB (pa_threaded_mainloop_new, pa_threaded_mainloop *,
220 (void),
221 ())
222PROXY_STUB_VOID(pa_threaded_mainloop_wait,
223 (pa_threaded_mainloop *m),
224 (m))
225PROXY_STUB (pa_threaded_mainloop_start, int,
226 (pa_threaded_mainloop *m),
227 (m))
228PROXY_STUB_VOID(pa_threaded_mainloop_lock,
229 (pa_threaded_mainloop *m),
230 (m))
231
232PROXY_STUB (pa_usec_to_bytes, size_t,
233 (pa_usec_t t, const pa_sample_spec *spec),
234 (t, spec))
235
236typedef struct
237{
238 const char *name;
239 void (**fn)(void);
240} SHARED_FUNC;
241
242#define ELEMENT(function) { #function , (void (**)(void)) & g_pfn_ ## function }
243static SHARED_FUNC SharedFuncs[] =
244{
245 ELEMENT(pa_bytes_per_second),
246 ELEMENT(pa_bytes_to_usec),
247 ELEMENT(pa_channel_map_init_auto),
248
249 ELEMENT(pa_context_connect),
250 ELEMENT(pa_context_disconnect),
251 ELEMENT(pa_context_get_server_info),
252 ELEMENT(pa_context_get_sink_info_by_name),
253 ELEMENT(pa_context_get_source_info_by_name),
254 ELEMENT(pa_context_get_state),
255 ELEMENT(pa_context_unref),
256 ELEMENT(pa_context_errno),
257 ELEMENT(pa_context_new),
258 ELEMENT(pa_context_set_state_callback),
259
260 ELEMENT(pa_frame_size),
261 ELEMENT(pa_get_library_version),
262 ELEMENT(pa_operation_unref),
263 ELEMENT(pa_operation_get_state),
264 ELEMENT(pa_operation_cancel),
265 ELEMENT(pa_rtclock_now),
266 ELEMENT(pa_sample_format_to_string),
267 ELEMENT(pa_sample_spec_valid),
268 ELEMENT(pa_strerror),
269
270 ELEMENT(pa_stream_connect_playback),
271 ELEMENT(pa_stream_connect_record),
272 ELEMENT(pa_stream_disconnect),
273 ELEMENT(pa_stream_get_sample_spec),
274 ELEMENT(pa_stream_set_latency_update_callback),
275 ELEMENT(pa_stream_write),
276 ELEMENT(pa_stream_unref),
277 ELEMENT(pa_stream_get_state),
278 ELEMENT(pa_stream_get_latency),
279 ELEMENT(pa_stream_get_timing_info),
280 ELEMENT(pa_stream_readable_size),
281 ELEMENT(pa_stream_set_buffer_attr),
282 ELEMENT(pa_stream_set_state_callback),
283 ELEMENT(pa_stream_set_underflow_callback),
284 ELEMENT(pa_stream_set_overflow_callback),
285 ELEMENT(pa_stream_set_write_callback),
286 ELEMENT(pa_stream_flush),
287 ELEMENT(pa_stream_drain),
288 ELEMENT(pa_stream_trigger),
289 ELEMENT(pa_stream_new),
290 ELEMENT(pa_stream_get_buffer_attr),
291 ELEMENT(pa_stream_peek),
292 ELEMENT(pa_stream_cork),
293 ELEMENT(pa_stream_drop),
294 ELEMENT(pa_stream_writable_size),
295
296 ELEMENT(pa_threaded_mainloop_stop),
297 ELEMENT(pa_threaded_mainloop_get_api),
298 ELEMENT(pa_threaded_mainloop_free),
299 ELEMENT(pa_threaded_mainloop_signal),
300 ELEMENT(pa_threaded_mainloop_unlock),
301 ELEMENT(pa_threaded_mainloop_new),
302 ELEMENT(pa_threaded_mainloop_wait),
303 ELEMENT(pa_threaded_mainloop_start),
304 ELEMENT(pa_threaded_mainloop_lock),
305
306 ELEMENT(pa_usec_to_bytes)
307};
308#undef ELEMENT
309
310/**
311 * Try to dynamically load the PulseAudio libraries. This function is not
312 * thread-safe, and should be called before attempting to use any of the
313 * PulseAudio functions.
314 *
315 * @returns iprt status code
316 */
317int audioLoadPulseLib(void)
318{
319 int rc = VINF_SUCCESS;
320 unsigned i;
321 static enum { NO = 0, YES, FAIL } isLibLoaded = NO;
322 RTLDRMOD hLib;
323
324 LogFlowFunc(("\n"));
325 /* If this is not NO then the function has obviously been called twice,
326 which is likely to be a bug. */
327 if (NO != isLibLoaded)
328 {
329 AssertMsgFailed(("isLibLoaded == %s\n", YES == isLibLoaded ? "YES" : "NO"));
330 return YES == isLibLoaded ? VINF_SUCCESS : VERR_NOT_SUPPORTED;
331 }
332 isLibLoaded = FAIL;
333 rc = RTLdrLoad(VBOX_PULSE_LIB, &hLib);
334 if (RT_FAILURE(rc))
335 {
336 LogRelFunc(("Failed to load library %s\n", VBOX_PULSE_LIB));
337 return rc;
338 }
339 for (i=0; i<RT_ELEMENTS(SharedFuncs); i++)
340 {
341 rc = RTLdrGetSymbol(hLib, SharedFuncs[i].name, (void**)SharedFuncs[i].fn);
342 if (RT_FAILURE(rc))
343 return rc;
344 }
345 isLibLoaded = YES;
346 return rc;
347}
348
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette