diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c
index 8e17b495f53030afa1c6fc0abf25e03b35d9ac08..723c7949af9c3a6d90b7a6abbdbc0df85734cf9b 100644
--- a/src/xpdev/xpbeep.c
+++ b/src/xpdev/xpbeep.c
@@ -165,6 +165,8 @@ struct alsa_api_struct {
 				(snd_pcm_t *pcm);
 	snd_pcm_sframes_t (*snd_pcm_writei)
 				(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
+	int		(*snd_pcm_drain)
+				(snd_pcm_t *pcm);
 };
 
 struct alsa_api_struct *alsa_api=NULL;
@@ -418,6 +420,7 @@ BOOL xptone_open(void)
 					|| ((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)
 					) {
 				if(dl)
 					xp_dlclose(dl);
@@ -601,6 +604,9 @@ void xp_play_sample_thread(void *data)
 					xptone_close();
 					xptone_open();
 				}
+				else {
+					alsa_api->snd_pcm_drain(playback_handle);
+				}
 			}
 		}
 	#endif
@@ -730,6 +736,7 @@ BOOL DLLCALL xp_play_sample(const unsigned char *sample, size_t sample_size, BOO
 				xptone_open();
 			}
 			else {
+				alsa_api->snd_pcm_drain(playback_handle);
 				if(must_close)
 					xptone_close();
 				return(TRUE);