root/include/gpac/modules/audio_out.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jean Le Feuvre
 *                      Copyright (c) Telecom ParisTech 2000-2012
 *                                      All rights reserved
 *
 *  This file is part of GPAC / modules interfaces
 *
 *  GPAC 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, or (at your option)
 *  any later version.
 *
 *  GPAC 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 library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


/*

                Note on video driver: this is not a graphics driver, the only thing requested from this driver
        is accessing video memory and performing stretch of YUV and RGB on the backbuffer (bitmap node)
        the graphics driver is a different entity that performs 2D rasterization

*/

#ifndef _GF_MODULE_AUDIO_OUT_H_
#define _GF_MODULE_AUDIO_OUT_H_

#ifdef __cplusplus
extern "C" {
#endif

/*include event system*/
#include <gpac/module.h>


/*
        Audio hardware output module
*/

/*interface name and version for audio output*/
#define GF_AUDIO_OUTPUT_INTERFACE               GF_4CC('G','A','O', '1')

/*interface returned on query interface*/
typedef struct _audiooutput
{
        /* interface declaration*/
        GF_DECL_MODULE_INTERFACE

        /*setup system
                Win32: os_handle is HWND

        if num_buffer is set, the audio driver should work with num_buffers with a total amount of audio data
        equal to total_duration ms
        if not set the driver is free to decide what to do
        */
        GF_Err (*Setup) (struct _audiooutput *aout, void *os_handle, u32 num_buffers, u32 total_duration);

        /*shutdown system */
        void (*Shutdown) (struct _audiooutput *aout);

        /*query output frequency available - if the requested sampleRate is not available, the driver shall return the best
        possible sampleRate able to handle NbChannels and NbBitsPerSample - if it doesn't handle the NbChannels
        the internal mixer will do it
        */
        GF_Err (*QueryOutputSampleRate)(struct _audiooutput *aout, u32 *io_desired_samplerate, u32 *io_NbChannels, u32 *io_nbBitsPerSample);

        /*set output config - if audio is not running, driver must start it
        *SampleRate, *NbChannels, *nbBitsPerSample:
                input: desired value
                output: final values
        channel_cfg is the channels output cfg, eg set of flags as specified in constants.h
        */
        GF_Err (*ConfigureOutput) (struct _audiooutput *aout, u32 *SampleRate, u32 *NbChannels, u32 *nbBitsPerSample, u32 channel_cfg);

        /*returns total buffer size used in ms. This is needed to compute the min size of audio decoders output*/
        u32 (*GetTotalBufferTime)(struct _audiooutput *aout);

        /*returns audio delay in ms, eg time delay until written audio data is outputed by the sound card
        This function is only called after ConfigureOuput*/
        u32 (*GetAudioDelay)(struct _audiooutput *aout);

        /*set output volume(between 0 and 100) */
        void (*SetVolume) (struct _audiooutput *aout, u32 Volume);
        /*set balance (between 0 and 100, 0=full left, 100=full right)*/
        void (*SetPan) (struct _audiooutput *aout, u32 pan);
        /*freezes soundcard flow - must not be NULL for self threaded
                PlayType: 0: pause, 1: resume, 2: reset HW buffer and play.
        */
        void (*Play) (struct _audiooutput *aout, u32 PlayType);
        /*specifies whether the driver relies on the app to feed data or runs standalone*/
        Bool SelfThreaded;

        /*if not using private thread, this should perform sleep & fill of HW buffer
                the audio render loop in this case is: while (run) {driver->WriteAudio(); if (reconf) Reconfig();}
        the driver must therefore give back the hand to the renderer as often as possible - the usual way is:
                gf_sleep until hw data can be written
                write HW data
                return
        */
        void (*WriteAudio)(struct _audiooutput *aout);

        /*if using private thread the following MUST be provided*/
        void (*SetPriority)(struct _audiooutput *aout, u32 priority);

        /*your private data handler - should be allocated when creating the interface object*/
        void *opaque;

        /*these are assigned by the audio renderer once module is loaded*/

        /*fills the buffer with audio data, returns effective bytes written - the rest is filled with 0*/
        u32 (*FillBuffer) (void *audio_renderer, char *buffer, u32 buffer_size);
        void *audio_renderer;

} GF_AudioOutput;


/*
        Audio hardware output module
*/

/*interface name and version for audio output*/
#define GF_AUDIO_FILTER_INTERFACE               GF_4CC('G','A','F', '1')

/*interface returned on query interface*/
typedef struct _tag_audio_filter GF_AudioFilter;

struct _tag_audio_filter
{
        /* interface declaration*/
        GF_DECL_MODULE_INTERFACE

        /*sets the current filter. The filterstring is opaque to libgpac and is taken as given
        in the GPAC configuration file, where filters are listed as a ';;' separated list in the "Filter" key of
        the [Audio] section.
                @returns: 1 is this module can handle the filterstring, 0 otherwise.
        */
        Bool (*SetFilter)(GF_AudioFilter *af, char *filterstring);
        /*configures the filter:
                @samplerate: samplerate of data - this cannot be modified by a filter
                @bits_per_sample: sample format (8 or 16 bit signed PCM data) of data - this cannot be modified by a filter
                @input_channel_number: number of input channels
                @input_channel_layout: channel layout of input data - cf <gpac/constants.h>
                @output_channel_number: number of ouput channels
                @output_channel_layout: channel layout of output data - cf <gpac/constants.h>
                &output_block_size_in_samples: size in blocks of the data to be sent to this filter.
                                If 0, data will not be reframed and blocks of any number of samples will be processed
                @delay_ms: delay in ms introduced by this filter
                @inplace_processing_capable: if set to 1, this filter is capable of processing data inplace, in which case
                        the same buffer is passed for in_data and out_data in the process call
        */
        GF_Err (*Configure)(GF_AudioFilter *af, u32 samplerate, u32 bits_per_sample, u32 input_channel_number, u32 input_channel_layout, u32 *output_channel_number, u32 *output_channel_layout, u32 *output_block_size_in_samples, u32 *delay_ms, Bool *inplace_processing_capable);
        /*process a chunk of audio data.
                @in_data: input sample buffer
                @in_data_size: input sample buffer size. If block len was set in the configure stage, there will be block len sample
                @out_data: output sample buffer - if inplace was set in the configure stage, same as in_data.
                                NOTE: Outputing more samples that input ones may crash the system, the buffer only contains space for
                        the same amount of samples (including channels added/removed by the filter)
                @out_data_size: data size written to output. Usually 0 or in_data_size.
        */
        GF_Err (*Process)(GF_AudioFilter *af, void *in_data, u32 in_data_size, void *out_data, u32 *out_data_size);

        /*gets an option from the filter - currently not implemented */
        const char *(*GetOption)(GF_AudioFilter *af, char *option);
        /*sets an option to the filter - currently not implemented */
        Bool (*SetOption)(GF_AudioFilter *af, char *option, char *value);

        /*Indicates the filter should be reset (audio stop or seek )*/
        void (*Reset)(GF_AudioFilter *af);

        /*private user data for the module*/
        void *udta;
};

#ifdef __cplusplus
}
#endif


#endif  /*_GF_MODULE_AUDIO_OUT_H_*/


/* [<][>][^][v][top][bottom][index][help] */