/* * 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_*/