[vlc-devel] [PATCH 2/2] audiotrack: add java module
Rémi Denis-Courmont
remi at remlab.net
Fri Feb 6 16:15:50 CET 2015
Le 2015-02-06 18:03, Thomas Guillem a écrit :
> This module is based on the old native audiotrack but use the public
> Java
use*s*
> AudioTrack API via JNI. All JNI operations are done in a separate
> thread in
> order to avoid an overhead when attaching and detaching the current
> thread to
the overhead
> the Java VM.
>
> News since native audiotrack:
> - Flush discards audio immediatly (if not wait).
immediat*e*ly
> - It adds support for float (for android 5.0 and after).
*A*ndroid, unless you are refering to a human-shaped robot.
> - It can handle a mediaserver crash and restart (for android 5.0 and
> after).
> ---
> modules/audio_output/audiotrack.c | 865
> ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 865 insertions(+)
> create mode 100644 modules/audio_output/audiotrack.c
>
> diff --git a/modules/audio_output/audiotrack.c
> b/modules/audio_output/audiotrack.c
> new file mode 100644
> index 0000000..09ef3fb
> --- /dev/null
> +++ b/modules/audio_output/audiotrack.c
> @@ -0,0 +1,865 @@
>
> +/*****************************************************************************
> + * audiotrack.c: Android Java AudioTrack audio output module
> +
>
> *****************************************************************************
> + * Copyright © 2012-2015 VLC authors and VideoLAN
> + *
> + * Authors: Thomas Guillem <thomas at gllm.fr>
> + * Ming Hu <tewilove at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or
> modify it
> + * under the terms of the GNU Lesser General Public License as
> published by
> + * the Free Software Foundation; either version 2.1 of the License,
> or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> License
> + * along with this program; if not, write to the Free Software
> Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> +
>
> *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <assert.h>
> +#include <jni.h>
> +
> +#include <vlc_common.h>
> +#include <vlc_plugin.h>
> +#include <vlc_aout.h>
> +#include <vlc_threads.h>
> +
> +#include <dlfcn.h>
> +#include <assert.h>
> +
> +static int Open( vlc_object_t * );
> +static void Close( vlc_object_t * );
> +
> +struct aout_sys_t {
> + /* sw gain */
> + float soft_gain;
> + bool soft_mute;
> +
> + /* Owned by JNIThread */
> + jobject p_audiotrack; /* AudioTrack ref */
> + jbyteArray p_bytearray; /* ByteArray ref */
> + size_t i_bytearray_size; /* size of the ByteArray */
> + audio_sample_format_t fmt; /* fmt setup by Start */
> + uint32_t i_samples_written; /* samples written since start/flush
> */
> + uint32_t i_dsp_initial; /* initial delay of the dsp */
> + int i_bytes_per_frame; /* byte per frame */
> +
> + /* JNIThread control */
> + vlc_mutex_t mutex;
> + vlc_cond_t cond;
> + vlc_thread_t thread;
> + bool b_thread_run; /* is thread alive */
> + struct thread_cmd *p_cmd; /* actual cmd process by JNIThread */
> +};
> +
> +/* Soft volume helper */
> +#include "audio_output/volume.h"
> +
> +vlc_module_begin ()
> + set_shortname( "AudioTrack" )
> + set_description( N_( "Android AudioTrack audio output" ) )
> + set_capability( "audio output", 180 )
> + set_category( CAT_AUDIO )
> + set_subcategory( SUBCAT_AUDIO_AOUT )
> + add_sw_gain()
> + add_shortcut( "audiotrack" )
> + set_callbacks( Open, Close )
> +vlc_module_end ()
> +
> +struct thread_cmd {
> + enum {
> + CMD_START,
> + CMD_STOP,
> + CMD_PLAY,
> + CMD_PAUSE,
> + CMD_FLUSH,
> + CMD_TIME_GET,
> + CMD_DONE,
> + } id;
> + union {
> + struct {
> + audio_sample_format_t fmt;
> + } start;
> + struct {
> + block_t *p_buffer;
> + } play;
> + struct {
> + bool b_pause;
> + mtime_t i_date;
> + } pause;
> + struct {
> + bool b_wait;
> + } flush;
> + } in;
> + union {
> + struct {
> + int i_ret;
> + audio_sample_format_t fmt;
> + } start;
> + struct {
> + int i_ret;
> + mtime_t i_delay;
> + } time_get;
> + } out;
> +};
With level triggers instead of edge triggers, you wouldn't need to
allocate messages, nor care about congestion control and flushing the
command queue.
YMMV.
--
Rémi Denis-Courmont
More information about the vlc-devel
mailing list