Commit c7d10e49 authored by Rafaël Carré's avatar Rafaël Carré

native audiotrack: add synchronisation and pause support

Pause by Dominique Martinet <asmadeus@codewreck.org>
parent 6fbee1a4
From 3c946805a63828f4b7d5ee4a7d99a8546c74213c Mon Sep 17 00:00:00 2001
From f812e399247f80d7d65b06da96b34ec332b276f0 Mon Sep 17 00:00:00 2001
From: Ming Hu <tewilove@gmail.com>
Date: Sun, 13 May 2012 22:20:34 +0200
Subject: [PATCH 2/3] Android: add native AudioTrack aout module
Subject: [PATCH 2/4] Android: add native AudioTrack aout module
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
---
configure.ac | 12 ++
modules/audio_output/Modules.am | 1 +
modules/audio_output/audiotrack.c | 302 +++++++++++++++++++++++++++++++++++++
3 files changed, 315 insertions(+)
modules/audio_output/audiotrack.c | 333 +++++++++++++++++++++++++++++++++++++
3 files changed, 346 insertions(+)
create mode 100644 modules/audio_output/audiotrack.c
diff --git a/configure.ac b/configure.ac
index 8765b14..1bf7692 100644
index 3b66640..5e0619b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3536,6 +3536,18 @@ if test "${HAVE_ANDROID}" = "1"; then
@@ -3538,6 +3538,18 @@ if test "${HAVE_ANDROID}" = "1"; then
fi
dnl
......@@ -48,10 +48,10 @@ index ea30d4d..85f2b3d 100644
libadummy_plugin_la_CFLAGS = $(AM_CFLAGS)
diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
new file mode 100644
index 0000000..78289af
index 0000000..555b0b8
--- /dev/null
+++ b/modules/audio_output/audiotrack.c
@@ -0,0 +1,301 @@
@@ -0,0 +1,333 @@
+/*****************************************************************************
+ * audiotrack.c: Android native AudioTrack audio output module
+ *****************************************************************************
......@@ -140,6 +140,8 @@ index 0000000..78289af
+typedef int (*AudioTrack_write)(void *, void const*, unsigned int);
+// _ZN7android10AudioTrack5flushEv
+typedef int (*AudioTrack_flush)(void *);
+// _ZN7android10AudioTrack5pauseEv
+typedef int (*AudioTrack_pause)(void *);
+
+struct aout_sys_t {
+ void *libmedia;
......@@ -158,6 +160,7 @@ index 0000000..78289af
+ AudioTrack_stop at_stop;
+ AudioTrack_write at_write;
+ AudioTrack_flush at_flush;
+ AudioTrack_pause at_pause;
+};
+
+static void *InitLibrary(struct aout_sys_t *p_sys);
......@@ -165,6 +168,7 @@ index 0000000..78289af
+static int Open(vlc_object_t *);
+static void Close(vlc_object_t *);
+static void Play(audio_output_t *, block_t *);
+static void Pause (audio_output_t *, bool, mtime_t);
+
+vlc_module_begin ()
+ set_shortname("AudioTrack")
......@@ -176,7 +180,8 @@ index 0000000..78289af
+ set_callbacks(Open, Close)
+vlc_module_end ()
+
+static void *InitLibrary(struct aout_sys_t *p_sys) {
+static void *InitLibrary(struct aout_sys_t *p_sys)
+{
+ /* DL Open libmedia */
+ void *p_library;
+ p_library = dlopen("libmedia.so", RTLD_NOW);
......@@ -196,6 +201,7 @@ index 0000000..78289af
+ p_sys->at_stop = (AudioTrack_stop)(dlsym(p_library, "_ZN7android10AudioTrack4stopEv"));
+ p_sys->at_write = (AudioTrack_write)(dlsym(p_library, "_ZN7android10AudioTrack5writeEPKvj"));
+ p_sys->at_flush = (AudioTrack_flush)(dlsym(p_library, "_ZN7android10AudioTrack5flushEv"));
+ p_sys->at_pause = (AudioTrack_pause)(dlsym(p_library, "_ZN7android10AudioTrack5pauseEv"));
+
+ /* We need the first 3 or the last 1 */
+ if (!((p_sys->as_getOutputFrameCount && p_sys->as_getOutputLatency && p_sys->as_getOutputSamplingRate)
......@@ -213,7 +219,8 @@ index 0000000..78289af
+ return p_library;
+}
+
+static int Open(vlc_object_t *p_this) {
+static int Open(vlc_object_t *p_this)
+{
+ struct aout_sys_t *p_sys;
+ audio_output_t *p_aout = (audio_output_t*)(p_this);
+
......@@ -325,13 +332,15 @@ index 0000000..78289af
+
+ p_aout->sys = p_sys;
+ p_aout->pf_play = Play;
+ p_aout->pf_pause = Pause;
+
+ p_sys->at_start(p_sys->AudioTrack);
+
+ return VLC_SUCCESS;
+}
+
+static void Close(vlc_object_t *p_this) {
+static void Close(vlc_object_t *p_this)
+{
+ audio_output_t *p_aout = (audio_output_t*)p_this;
+ aout_sys_t *p_sys = p_aout->sys;
+
......@@ -343,9 +352,21 @@ index 0000000..78289af
+ free(p_sys);
+}
+
+static void Play(audio_output_t *p_aout, block_t *p_buffer) {
+static void Play(audio_output_t *p_aout, block_t *p_buffer)
+{
+ aout_sys_t *p_sys = p_aout->sys;
+
+ uint32_t latency;
+ int ret = p_sys->as_getOutputLatency(&latency, MUSIC);
+ if (!ret) {
+ mtime_t delay = latency * CLOCK_FREQ / 100;
+ if (latency != 55)
+ msg_Dbg(p_aout, "latency %d", latency);
+ aout_TimeReport(p_aout, p_buffer->i_pts - delay);
+ } else {
+ msg_Err(p_aout, "Could not get latency");
+ }
+
+ size_t length = 0;
+ while (length < p_buffer->i_buffer) {
+ length += p_sys->at_write(p_sys->AudioTrack, (char*)(p_buffer->p_buffer) + length, p_buffer->i_buffer - length);
......@@ -353,6 +374,17 @@ index 0000000..78289af
+
+ block_Release( p_buffer );
+}
+
+static void Pause(audio_output_t *p_aout, bool pause, mtime_t date)
+{
+ aout_sys_t *p_sys = p_aout->sys;
+
+ if (pause) {
+ p_sys->at_pause(p_sys->AudioTrack);
+ } else {
+ p_sys->at_start(p_sys->AudioTrack);
+ }
+}
--
1.7.5.4
1.7.9.5
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment