summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-07-02 09:22:32 +0300
committerUoti Urpala <uau@mplayer2.org>2011-07-02 09:22:32 +0300
commitc8b3088c1831ab5f698924ce75127caa55b50dbb (patch)
tree12ca3b7d7b53ff9458b80f2c83de2cf29d522862 /libao2
parent746f9b004038e09392b69abb3ba26b1cc32a90d7 (diff)
downloadmpv-c8b3088c1831ab5f698924ce75127caa55b50dbb.tar.bz2
mpv-c8b3088c1831ab5f698924ce75127caa55b50dbb.tar.xz
audio: move ready-for-ao data buffer from decoder to AO
Move the buffer storing audio data ready to be fed to the audio output driver from the audio decoder object to the AO object. This will help encoding code deal with end of input, and may also be useful to improve other general gapless audio behavior (as AOs which do not accept chunks smaller than a certain size may keep them in the buffer while the decoder changes). Less data may be dropped now when changing audio filters or switching timeline parts.
Diffstat (limited to 'libao2')
-rw-r--r--libao2/audio_out.c6
-rw-r--r--libao2/audio_out.h4
2 files changed, 10 insertions, 0 deletions
diff --git a/libao2/audio_out.c b/libao2/audio_out.c
index 14cab9b285..bd06c8fd5f 100644
--- a/libao2/audio_out.c
+++ b/libao2/audio_out.c
@@ -221,8 +221,12 @@ void ao_init(struct ao *ao, char **ao_list)
void ao_uninit(struct ao *ao, bool cut_audio)
{
+ assert(ao->buffer.len >= ao->buffer_playable_size);
+ ao->buffer.len = ao->buffer_playable_size;
if (ao->initialized)
ao->driver->uninit(ao, cut_audio);
+ if (!cut_audio && ao->buffer.len)
+ mp_msg(MSGT_AO, MSGL_WARN, "Audio output truncated at end.\n");
talloc_free(ao);
}
@@ -254,6 +258,8 @@ int ao_get_space(struct ao *ao)
void ao_reset(struct ao *ao)
{
+ ao->buffer.len = 0;
+ ao->buffer_playable_size = 0;
if (ao->driver->reset)
ao->driver->reset(ao);
}
diff --git a/libao2/audio_out.h b/libao2/audio_out.h
index fb62923297..628b9c3ae7 100644
--- a/libao2/audio_out.h
+++ b/libao2/audio_out.h
@@ -21,6 +21,8 @@
#include <stdbool.h>
+#include "bstr.h"
+
typedef struct ao_info {
/* driver name ("Matrox Millennium G200/G400" */
const char *name;
@@ -71,6 +73,8 @@ struct ao {
int outburst;
int buffersize;
int pts;
+ struct bstr buffer;
+ int buffer_playable_size;
bool initialized;
bool untimed;
const struct ao_driver *driver;