summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-03 17:54:35 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-03 17:54:35 +0000
commit31d2778fc6da50586a8eac5741fdd151b5724ba7 (patch)
treeab6ea5161013e036602239f70f4be8c9d88a2357 /libao2
parent2124a9a36f23eae68cc12a531947b69136263cb5 (diff)
downloadmpv-31d2778fc6da50586a8eac5741fdd151b5724ba7.tar.bz2
mpv-31d2778fc6da50586a8eac5741fdd151b5724ba7.tar.xz
better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10515 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2')
-rw-r--r--libao2/ao_alsa1x.c51
-rw-r--r--libao2/ao_alsa9.c51
2 files changed, 64 insertions, 38 deletions
diff --git a/libao2/ao_alsa1x.c b/libao2/ao_alsa1x.c
index 18ca7d226a..b0792121d8 100644
--- a/libao2/ao_alsa1x.c
+++ b/libao2/ao_alsa1x.c
@@ -70,6 +70,7 @@ int first = 1;
static int open_mode;
static int set_block_mode;
+static int alsa_can_pause = 0;
#define ALSA_DEVICE_SIZE 48
@@ -683,6 +684,7 @@ static int init(int rate_hz, int channels, int format, int flags)
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
@@ -695,9 +697,9 @@ static void uninit()
int err;
if (!ao_noblock) {
- if ((err = snd_pcm_drain(alsa_handler)) < 0)
+ if ((err = snd_pcm_drop(alsa_handler)) < 0)
{
- printf("alsa-uninit: pcm drain error: %s\n", snd_strerror(err));
+ printf("alsa-uninit: pcm drop error: %s\n", snd_strerror(err));
return;
}
}
@@ -722,19 +724,20 @@ static void audio_pause()
{
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 @@ static void audio_resume()
{
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;
+ }
}
}
diff --git a/libao2/ao_alsa9.c b/libao2/ao_alsa9.c
index 18ca7d226a..b0792121d8 100644
--- a/libao2/ao_alsa9.c
+++ b/libao2/ao_alsa9.c
@@ -70,6 +70,7 @@ int first = 1;
static int open_mode;
static int set_block_mode;
+static int alsa_can_pause = 0;
#define ALSA_DEVICE_SIZE 48
@@ -683,6 +684,7 @@ static int init(int rate_hz, int channels, int format, int flags)
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
@@ -695,9 +697,9 @@ static void uninit()
int err;
if (!ao_noblock) {
- if ((err = snd_pcm_drain(alsa_handler)) < 0)
+ if ((err = snd_pcm_drop(alsa_handler)) < 0)
{
- printf("alsa-uninit: pcm drain error: %s\n", snd_strerror(err));
+ printf("alsa-uninit: pcm drop error: %s\n", snd_strerror(err));
return;
}
}
@@ -722,19 +724,20 @@ static void audio_pause()
{
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 @@ static void audio_resume()
{
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;
+ }
}
}