--- libao2/ao_alsa9.c.orig Wed Jul 30 11:29:25 2003 +++ libao2/ao_alsa9.c Wed Jul 30 13:48:28 2003 @@ -70,6 +70,7 @@ static int open_mode; static int set_block_mode; +static int alsa_can_pause; #define ALSA_DEVICE_SIZE 48 @@ -683,6 +684,7 @@ snd_pcm_format_description(alsa_format)); } // end switch alsa_handler (spdif) + alsa_can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams); return(1); } // end init @@ -722,19 +724,20 @@ { int err; - if (!ao_noblock) { - //drain causes error in nonblock-mode! - if ((err = snd_pcm_drain(alsa_handler)) < 0) - { - printf("alsa-pause: pcm drain error: %s\n", snd_strerror(err)); - return; - } - } - else { - if (verbose>0) - printf("alsa-pause: paused nonblock\n"); - - return; + if (alsa_can_pause) { + if ((err = snd_pcm_pause(alsa_handler, 1)) < 0) + { + printf("alsa-pause: pcm pause error: %s\n", snd_strerror(err)); + return; + } + if (verbose) + printf("alsa-pause: pause supported by hardware\n"); + } else { + if ((err = snd_pcm_drop(alsa_handler)) < 0) + { + printf("alsa-pause: pcm drop error: %s\n", snd_strerror(err)); + return; + } } } @@ -742,10 +745,20 @@ { int err; - if ((err = snd_pcm_prepare(alsa_handler)) < 0) - { - printf("alsa-resume: pcm prepare error: %s\n", snd_strerror(err)); - return; + if (alsa_can_pause) { + if ((err = snd_pcm_pause(alsa_handler, 0)) < 0) + { + printf("alsa-resume: pcm resume error: %s\n", snd_strerror(err)); + return; + } + if (verbose) + printf("alsa-resume: resume supported by hardware\n"); + } else { + if ((err = snd_pcm_prepare(alsa_handler)) < 0) + { + printf("alsa-resume: pcm prepare error: %s\n", snd_strerror(err)); + return; + } } }