[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