diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index 13243e4d9dcec88fbc28090a77b59351c243ab5c..4e4cfd4207240aeb05114ea70f1c7249f53d1d95 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -116,6 +116,7 @@ static int handle_rc; #ifdef WITH_PULSEAUDIO struct pulseaudio_api_struct { + dll_handle dl; pa_simple* (*simple_new)(const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error); int (*simple_write)(pa_simple * s, const void * data, size_t bytes, int * error); int (*simple_drain)(pa_simple * s, int * error); @@ -137,6 +138,7 @@ static bool portaudio_initialized=false; #define PaTimestamp PaTime #endif struct portaudio_api_struct { + dll_handle dl; PaError (*init)( void ); PaError (*open)( PaStream** stream, int numInputChannels, @@ -186,6 +188,7 @@ static int dsp; #ifdef USE_ALSA_SOUND struct alsa_api_struct { + dll_handle dl; int (*snd_pcm_open) (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode); int (*snd_pcm_hw_params_malloc) @@ -403,17 +406,16 @@ xptone_open_locked(void) #ifdef WITH_PULSEAUDIO if(!pulseaudio_device_open_failed) { if(pu_api==NULL) { - dll_handle dl=NULL; const char *libnames[]={"pulse-simple",NULL}; if(((pu_api=(struct pulseaudio_api_struct *)malloc(sizeof(struct pulseaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pu_api->simple_new=xp_dlsym(dl,pa_simple_new))==NULL) - || ((pu_api->simple_write=xp_dlsym(dl,pa_simple_write))==NULL) - || ((pu_api->simple_drain=xp_dlsym(dl,pa_simple_drain))==NULL) - || ((pu_api->simple_free=xp_dlsym(dl,pa_simple_free))==NULL) + || ((pu_api->dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) + || ((pu_api->simple_new=xp_dlsym(pu_api->dl,pa_simple_new))==NULL) + || ((pu_api->simple_write=xp_dlsym(pu_api->dl,pa_simple_write))==NULL) + || ((pu_api->simple_drain=xp_dlsym(pu_api->dl,pa_simple_drain))==NULL) + || ((pu_api->simple_free=xp_dlsym(pu_api->dl,pa_simple_free))==NULL) ) { - if(dl) - xp_dlclose(dl); + if(pu_api->dl) + xp_dlclose(pu_api->dl); free(pu_api); pu_api=NULL; } @@ -446,34 +448,33 @@ xptone_open_locked(void) #ifdef WITH_PORTAUDIO if(!portaudio_device_open_failed) { if(pa_api==NULL) { - dll_handle dl=NULL; const char *libnames[]={"portaudio",NULL}; if(((pa_api=(struct portaudio_api_struct *)malloc(sizeof(struct portaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pa_api->init=xp_dlsym(dl,Pa_Initialize))==NULL) - || ((pa_api->open=xp_dlsym(dl,Pa_OpenDefaultStream))==NULL) - || ((pa_api->close=xp_dlsym(dl,Pa_CloseStream))==NULL) - || ((pa_api->start=xp_dlsym(dl,Pa_StartStream))==NULL) + || ((pa_api->dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) + || ((pa_api->init=xp_dlsym(pa_api->dl,Pa_Initialize))==NULL) + || ((pa_api->open=xp_dlsym(pa_api->dl,Pa_OpenDefaultStream))==NULL) + || ((pa_api->close=xp_dlsym(pa_api->dl,Pa_CloseStream))==NULL) + || ((pa_api->start=xp_dlsym(pa_api->dl,Pa_StartStream))==NULL) || ( - ((pa_api->active=xp_dlsym(dl,Pa_StreamActive))==NULL) - && ((pa_api->active=xp_dlsym(dl,Pa_IsStreamActive))==NULL) + ((pa_api->active=xp_dlsym(pa_api->dl,Pa_StreamActive))==NULL) + && ((pa_api->active=xp_dlsym(pa_api->dl,Pa_IsStreamActive))==NULL) ) - || ((pa_api->stop=xp_dlsym(dl,Pa_StopStream))==NULL) + || ((pa_api->stop=xp_dlsym(pa_api->dl,Pa_StopStream))==NULL) ) { - if(dl) - xp_dlclose(dl); + if(pa_api->dl) + xp_dlclose(pa_api->dl); free(pa_api); pa_api=NULL; } else { /* Get version and other optional pointers */ pa_api->ver=1800; - if((pa_api->version=xp_dlsym(dl, Pa_GetVersion))!=NULL) { + if((pa_api->version=xp_dlsym(pa_api->dl, Pa_GetVersion))!=NULL) { pa_api->ver=pa_api->version(); if(pa_api->ver >= 1899) { - if((pa_api->write=xp_dlsym(dl, Pa_WriteStream))==NULL) { - xp_dlclose(dl); + if((pa_api->write=xp_dlsym(pa_api->dl, Pa_WriteStream))==NULL) { + xp_dlclose(pa_api->dl); free(pa_api); pa_api=NULL; } @@ -568,26 +569,25 @@ xptone_open_locked(void) #ifdef USE_ALSA_SOUND if(!alsa_device_open_failed) { if(alsa_api==NULL) { - dll_handle dl=NULL; const char *libnames[]={"asound", NULL}; if(((alsa_api=(struct alsa_api_struct *)malloc(sizeof(struct alsa_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,2))==NULL) - || ((alsa_api->snd_pcm_open=xp_dlsym(dl,snd_pcm_open))==NULL) - || ((alsa_api->snd_pcm_hw_params_malloc=xp_dlsym(dl,snd_pcm_hw_params_malloc))==NULL) - || ((alsa_api->snd_pcm_hw_params_any=xp_dlsym(dl,snd_pcm_hw_params_any))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_access=xp_dlsym(dl,snd_pcm_hw_params_set_access))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_format=xp_dlsym(dl,snd_pcm_hw_params_set_format))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_rate_near=xp_dlsym(dl,snd_pcm_hw_params_set_rate_near))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_channels=xp_dlsym(dl,snd_pcm_hw_params_set_channels))==NULL) - || ((alsa_api->snd_pcm_hw_params=xp_dlsym(dl,snd_pcm_hw_params))==NULL) - || ((alsa_api->snd_pcm_prepare=xp_dlsym(dl,snd_pcm_prepare))==NULL) - || ((alsa_api->snd_pcm_hw_params_free=xp_dlsym(dl,snd_pcm_hw_params_free))==NULL) - || ((alsa_api->snd_pcm_close=xp_dlsym(dl,snd_pcm_close))==NULL) - || ((alsa_api->snd_pcm_writei=xp_dlsym(dl,snd_pcm_writei))==NULL) - || ((alsa_api->snd_pcm_drain=xp_dlsym(dl,snd_pcm_drain))==NULL) + || ((alsa_api->dl=xp_dlopen(libnames,RTLD_LAZY,2))==NULL) + || ((alsa_api->snd_pcm_open=xp_dlsym(alsa_api->dl,snd_pcm_open))==NULL) + || ((alsa_api->snd_pcm_hw_params_malloc=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_malloc))==NULL) + || ((alsa_api->snd_pcm_hw_params_any=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_any))==NULL) + || ((alsa_api->snd_pcm_hw_params_set_access=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_set_access))==NULL) + || ((alsa_api->snd_pcm_hw_params_set_format=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_set_format))==NULL) + || ((alsa_api->snd_pcm_hw_params_set_rate_near=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_set_rate_near))==NULL) + || ((alsa_api->snd_pcm_hw_params_set_channels=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_set_channels))==NULL) + || ((alsa_api->snd_pcm_hw_params=xp_dlsym(alsa_api->dl,snd_pcm_hw_params))==NULL) + || ((alsa_api->snd_pcm_prepare=xp_dlsym(alsa_api->dl,snd_pcm_prepare))==NULL) + || ((alsa_api->snd_pcm_hw_params_free=xp_dlsym(alsa_api->dl,snd_pcm_hw_params_free))==NULL) + || ((alsa_api->snd_pcm_close=xp_dlsym(alsa_api->dl,snd_pcm_close))==NULL) + || ((alsa_api->snd_pcm_writei=xp_dlsym(alsa_api->dl,snd_pcm_writei))==NULL) + || ((alsa_api->snd_pcm_drain=xp_dlsym(alsa_api->dl,snd_pcm_drain))==NULL) ) { - if(dl) - xp_dlclose(dl); + if(alsa_api->dl) + xp_dlclose(alsa_api->dl); free(alsa_api); alsa_api=NULL; alsa_device_open_failed=true;