summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_alsa.c
diff options
context:
space:
mode:
authorMartin Herkt <lachs0r@srsfckn.biz>2014-01-02 18:44:49 +0100
committerMartin Herkt <lachs0r@srsfckn.biz>2014-01-02 18:46:11 +0100
commit4350a76a01b63f138d5b5babe3894e6730753877 (patch)
tree42b6397daf4cc7493e7d7f5a971a2048a1be321d /audio/out/ao_alsa.c
parent4083ae1de37283210d022fb60b6128db276168d4 (diff)
downloadmpv-4350a76a01b63f138d5b5babe3894e6730753877.tar.bz2
mpv-4350a76a01b63f138d5b5babe3894e6730753877.tar.xz
ao_alsa: Unbreak pause/resume
Well that was dumb.
Diffstat (limited to 'audio/out/ao_alsa.c')
-rw-r--r--audio/out/ao_alsa.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c
index cdbd02fa76..e8b3405bb0 100644
--- a/audio/out/ao_alsa.c
+++ b/audio/out/ao_alsa.c
@@ -53,7 +53,6 @@ struct priv {
snd_pcm_t *alsa;
snd_pcm_format_t alsa_fmt;
int can_pause;
- int can_resume;
snd_pcm_sframes_t prepause_frames;
float delay_before_pause;
int buffersize; // in frames
@@ -522,7 +521,6 @@ static int init(struct ao *ao)
/* end setting sw-params */
p->can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams);
- p->can_resume = snd_pcm_hw_params_can_resume(alsa_hwparams);
MP_VERBOSE(ao, "opened: %d Hz/%d channels/%d bps/%d samples buffer/%s\n",
ao->samplerate, ao->channels.num, af_fmt2bits(ao->format),
@@ -590,16 +588,17 @@ static void audio_resume(struct ao *ao)
while ((err = snd_pcm_resume(p->alsa)) == -EAGAIN)
sleep(1);
+ }
- if (err < 0 || !p->can_resume) {
- /* Some ALSA drivers that cannot resume playback are buggy and
- fail to work even after snd_pcm_resume (or the high-level
- snd_pcm_recover) indicates success, so always call
- snd_pcm_prepare here. */
- MP_VERBOSE(ao, "hardware does not support resume\n");
- err = snd_pcm_prepare(p->alsa);
- CHECK_ALSA_ERROR("pcm prepare error");
- }
+ if (p->can_pause) {
+ err = snd_pcm_pause(p->alsa, 0);
+ CHECK_ALSA_ERROR("pcm resume error");
+ } else {
+ MP_VERBOSE(ao, "resume not supported by hardware\n");
+ err = snd_pcm_prepare(p->alsa);
+ CHECK_ALSA_ERROR("pcm prepare error");
+ if (p->prepause_frames)
+ ao_play_silence(ao, p->prepause_frames);
}
alsa_error: ;