Changeset 86496 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Oct 8, 2020 1:48:53 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/pulse_stubs.c
r82968 r86496 16 16 */ 17 17 18 19 /********************************************************************************************************************************* 20 * Header Files * 21 *********************************************************************************************************************************/ 18 22 #define LOG_GROUP LOG_GROUP_DRV_HOST_AUDIO 19 23 #include <iprt/assert.h> 20 24 #include <iprt/ldr.h> 21 25 #include <VBox/log.h> 22 #include <iprt/err core.h>26 #include <iprt/err.h> 23 27 24 28 #include <pulse/pulseaudio.h> … … 26 30 #include "pulse_stubs.h" 27 31 32 33 /********************************************************************************************************************************* 34 * Defined Constants And Macros * 35 *********************************************************************************************************************************/ 28 36 #define VBOX_PULSE_LIB "libpulse.so.0" 29 37 … … 234 242 (t, spec)) 235 243 236 typedef struct 244 #define FUNC_ENTRY(function) { #function , (void (**)(void)) & g_pfn_ ## function } 245 static struct 237 246 { 238 const char *name; 239 void (**fn)(void); 240 } SHARED_FUNC; 241 242 #define ELEMENT(function) { #function , (void (**)(void)) & g_pfn_ ## function } 243 static SHARED_FUNC SharedFuncs[] = 247 const char *pszName; 248 void (**pfn)(void); 249 } const g_aImportedFunctions[] = 244 250 { 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)251 FUNC_ENTRY(pa_bytes_per_second), 252 FUNC_ENTRY(pa_bytes_to_usec), 253 FUNC_ENTRY(pa_channel_map_init_auto), 254 255 FUNC_ENTRY(pa_context_connect), 256 FUNC_ENTRY(pa_context_disconnect), 257 FUNC_ENTRY(pa_context_get_server_info), 258 FUNC_ENTRY(pa_context_get_sink_info_by_name), 259 FUNC_ENTRY(pa_context_get_source_info_by_name), 260 FUNC_ENTRY(pa_context_get_state), 261 FUNC_ENTRY(pa_context_unref), 262 FUNC_ENTRY(pa_context_errno), 263 FUNC_ENTRY(pa_context_new), 264 FUNC_ENTRY(pa_context_set_state_callback), 265 266 FUNC_ENTRY(pa_frame_size), 267 FUNC_ENTRY(pa_get_library_version), 268 FUNC_ENTRY(pa_operation_unref), 269 FUNC_ENTRY(pa_operation_get_state), 270 FUNC_ENTRY(pa_operation_cancel), 271 FUNC_ENTRY(pa_rtclock_now), 272 FUNC_ENTRY(pa_sample_format_to_string), 273 FUNC_ENTRY(pa_sample_spec_valid), 274 FUNC_ENTRY(pa_strerror), 275 276 FUNC_ENTRY(pa_stream_connect_playback), 277 FUNC_ENTRY(pa_stream_connect_record), 278 FUNC_ENTRY(pa_stream_disconnect), 279 FUNC_ENTRY(pa_stream_get_sample_spec), 280 FUNC_ENTRY(pa_stream_set_latency_update_callback), 281 FUNC_ENTRY(pa_stream_write), 282 FUNC_ENTRY(pa_stream_unref), 283 FUNC_ENTRY(pa_stream_get_state), 284 FUNC_ENTRY(pa_stream_get_latency), 285 FUNC_ENTRY(pa_stream_get_timing_info), 286 FUNC_ENTRY(pa_stream_readable_size), 287 FUNC_ENTRY(pa_stream_set_buffer_attr), 288 FUNC_ENTRY(pa_stream_set_state_callback), 289 FUNC_ENTRY(pa_stream_set_underflow_callback), 290 FUNC_ENTRY(pa_stream_set_overflow_callback), 291 FUNC_ENTRY(pa_stream_set_write_callback), 292 FUNC_ENTRY(pa_stream_flush), 293 FUNC_ENTRY(pa_stream_drain), 294 FUNC_ENTRY(pa_stream_trigger), 295 FUNC_ENTRY(pa_stream_new), 296 FUNC_ENTRY(pa_stream_get_buffer_attr), 297 FUNC_ENTRY(pa_stream_peek), 298 FUNC_ENTRY(pa_stream_cork), 299 FUNC_ENTRY(pa_stream_drop), 300 FUNC_ENTRY(pa_stream_writable_size), 301 302 FUNC_ENTRY(pa_threaded_mainloop_stop), 303 FUNC_ENTRY(pa_threaded_mainloop_get_api), 304 FUNC_ENTRY(pa_threaded_mainloop_free), 305 FUNC_ENTRY(pa_threaded_mainloop_signal), 306 FUNC_ENTRY(pa_threaded_mainloop_unlock), 307 FUNC_ENTRY(pa_threaded_mainloop_new), 308 FUNC_ENTRY(pa_threaded_mainloop_wait), 309 FUNC_ENTRY(pa_threaded_mainloop_start), 310 FUNC_ENTRY(pa_threaded_mainloop_lock), 311 312 FUNC_ENTRY(pa_usec_to_bytes) 307 313 }; 308 #undef ELEMENT314 #undef FUNC_ENTRY 309 315 310 316 /** … … 317 323 int audioLoadPulseLib(void) 318 324 { 319 int rc = VINF_SUCCESS; 320 unsigned i; 321 static enum { NO = 0, YES, FAIL } isLibLoaded = NO; 325 static volatile int g_rc = VERR_IPE_UNINITIALIZED_STATUS; 322 326 RTLDRMOD hLib; 327 int rc; 323 328 324 329 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) 330 331 /* If this is not VERR_IPE_UNINITIALIZED_STATUS then the function has 332 obviously been called twice, which is likely to be a bug. */ 333 rc = g_rc; 334 AssertMsgReturn(rc == VERR_IPE_UNINITIALIZED_STATUS, ("g_rc=%Rrc\n", rc), rc); 335 336 rc = RTLdrLoadSystemEx(VBOX_PULSE_LIB, RTLDRLOAD_FLAGS_NO_UNLOAD, &hLib); 337 if (RT_SUCCESS(rc)) 328 338 { 329 AssertMsgFailed(("isLibLoaded == %s\n", YES == isLibLoaded ? "YES" : "NO")); 330 return YES == isLibLoaded ? VINF_SUCCESS : VERR_NOT_SUPPORTED; 339 unsigned i; 340 for (i = 0; i < RT_ELEMENTS(g_aImportedFunctions); i++) 341 { 342 rc = RTLdrGetSymbol(hLib, g_aImportedFunctions[i].pszName, (void **)g_aImportedFunctions[i].pfn); 343 if (RT_FAILURE(rc)) 344 { 345 LogRelFunc(("Failed to resolve function #%u: '%s' (%Rrc)\n", i, g_aImportedFunctions[i].pszName, rc)); 346 break; 347 } 348 } 331 349 } 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; 350 else 351 LogRelFunc(("Failed to load library %s: %Rrc\n", VBOX_PULSE_LIB, rc)); 352 g_rc = rc; 346 353 return rc; 347 354 }
Note:
See TracChangeset
for help on using the changeset viewer.