diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c
index 37b72855e4c14509802ad2410da928ffe165d537..8e17b495f53030afa1c6fc0abf25e03b35d9ac08 100644
--- a/src/xpdev/xpbeep.c
+++ b/src/xpdev/xpbeep.c
@@ -312,16 +312,17 @@ BOOL xptone_open(void)
 			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->active=xp_dlsym(dl,"Pa_StreamActive"))==NULL)
-					|| ((pa_api->stop=xp_dlsym(dl,"Pa_StopStream"))==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->active=xp_dlsym(dl,Pa_StreamActive))==NULL)
+					|| ((pa_api->stop=xp_dlsym(dl,Pa_StopStream))==NULL)
 					) {
 				if(dl)
 					xp_dlclose(dl);
-				portaudio_device_open_failed=TRUE;
+				free(pa_api);
+				pa_api=NULL;
             }
             if(pa_api==NULL) {
                 portaudio_device_open_failed=TRUE;
@@ -402,24 +403,26 @@ BOOL xptone_open(void)
 	if(!alsa_device_open_failed) {
 		if(alsa_api==NULL) {
 			dll_handle dl;
-			const char libnames[]={"asound", NULL};
+			const char *libnames[]={"asound", NULL};
 			if(((alsa_api=(struct alsa_api_struct *)malloc(sizeof(struct alsa_api_struct)))==NULL)
-					|| ((dl=xp_dlopen("libasound.so",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)
+					|| ((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)
 					) {
 				if(dl)
 					xp_dlclose(dl);
+				free(alsa_api);
+				alsa_api=NULL;
 				alsa_device_open_failed=TRUE;
 			}
 			if(alsa_api==NULL)
@@ -504,8 +507,10 @@ BOOL xptone_close(void)
 #endif
 
 #ifdef USE_ALSA_SOUND
-	if(handle_type==SOUND_DEVICE_ALSA)
+	if(handle_type==SOUND_DEVICE_ALSA) {
 		alsa_api->snd_pcm_close (playback_handle);
+		playback_handle=NULL;
+	}
 #endif
 
 #ifdef AFMT_U8
@@ -589,11 +594,13 @@ void xp_play_sample_thread(void *data)
 	#ifdef USE_ALSA_SOUND
 		if(handle_type==SOUND_DEVICE_ALSA) {
 			alsa_api->snd_pcm_hw_params_free(hw_params);
-			if(alsa_api->snd_pcm_writei(playback_handle, sample_buffer, sample_size)!=sample_size) {
-				/* Go back and try OSS */
-				alsa_device_open_failed=TRUE;
-				alsa_api->snd_pcm_close (playback_handle);
-				xptone_open();
+			if(playback_handle != NULL) {
+				if(alsa_api->snd_pcm_writei(playback_handle, sample_buffer, sample_size)!=sample_size) {
+					/* Go back and try OSS */
+					alsa_device_open_failed=TRUE;
+					xptone_close();
+					xptone_open();
+				}
 			}
 		}
 	#endif
@@ -715,16 +722,18 @@ BOOL DLLCALL xp_play_sample(const unsigned char *sample, size_t sample_size, BOO
 #ifdef USE_ALSA_SOUND
 	if(handle_type==SOUND_DEVICE_ALSA) {
 		alsa_api->snd_pcm_hw_params_free(hw_params);
-		if(alsa_api->snd_pcm_writei(playback_handle, sample, sample_size)!=sample_size) {
-			/* Go back and try OSS */
-			alsa_device_open_failed=TRUE;
-			alsa_api->snd_pcm_close (playback_handle);
-			xptone_open();
-		}
-		else {
-			if(must_close)
+		if(playback_handle != NULL) {
+			if(alsa_api->snd_pcm_writei(playback_handle, sample, sample_size)!=sample_size) {
+				/* Go back and try OSS */
+				alsa_device_open_failed=TRUE;
 				xptone_close();
-			return(TRUE);
+				xptone_open();
+			}
+			else {
+				if(must_close)
+					xptone_close();
+				return(TRUE);
+			}
 		}
 	}
 #endif