[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[384] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-16 11:32:59
|
Revision: 384 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=384&view=rev Author: nickols_k Date: 2012-11-16 11:32:49 +0000 (Fri, 16 Nov 2012) Log Message: ----------- new C++ sources & memory leaks-- Modified Paths: -------------- mplayerxp/dump.cpp mplayerxp/input2/input.cpp mplayerxp/libao2/Makefile mplayerxp/libao2/afmt.h mplayerxp/libao2/audio_out.h mplayerxp/libmpcodecs/Makefile mplayerxp/libmpcodecs/ad.h mplayerxp/libmpcodecs/dec_audio.h mplayerxp/libmpcodecs/dec_video.h mplayerxp/libmpcodecs/vd.h mplayerxp/libmpconf/Makefile mplayerxp/libmpconf/codec-cfg.h mplayerxp/libmpconf/m_property.h mplayerxp/libmpdemux/Makefile mplayerxp/libmpdemux/demuxer.cpp mplayerxp/libmpdemux/demuxer_r.cpp mplayerxp/libmpdemux/mrl.h mplayerxp/libmpdemux/muxer.h mplayerxp/libmpdemux/stheader.h mplayerxp/libmpsub/Makefile mplayerxp/libmpsub/spudec.h mplayerxp/libmpsub/vobsub.h mplayerxp/libplaytree/Makefile mplayerxp/libplaytree/asxparser.h mplayerxp/libplaytree/playtree.h mplayerxp/libplaytree/playtreeparser.h mplayerxp/libvo/Makefile mplayerxp/libvo/font_load.h mplayerxp/libvo/img_format.h mplayerxp/libvo/screenshot.h mplayerxp/libvo/vosub_vidix.c mplayerxp/mp-opt-reg.cpp mplayerxp/mp_msg.cpp mplayerxp/mplayerxp.cpp mplayerxp/nls/Makefile mplayerxp/nls/nls.h mplayerxp/osdep/Makefile mplayerxp/osdep/get_path.h mplayerxp/postproc/Makefile mplayerxp/postproc/af.h mplayerxp/postproc/libmenu/menu.h mplayerxp/postproc/swscale.h mplayerxp/postproc/vf.h mplayerxp/postproc/vf_scale.h mplayerxp/xmpcore/mp_aframe.cpp mplayerxp/xmpcore/mp_image.cpp mplayerxp/xmpcore/sig_hand.cpp mplayerxp/xmpcore/xmp_adecoder.cpp mplayerxp/xmpcore/xmp_aplayer.cpp mplayerxp/xmpcore/xmp_core.cpp mplayerxp/xmpcore/xmp_vdecoder.cpp mplayerxp/xmpcore/xmp_vplayer.cpp Added Paths: ----------- mplayerxp/libao2/afmt.cpp mplayerxp/libao2/audio_out.cpp mplayerxp/libao2/mixer.cpp mplayerxp/libmpcodecs/ad.cpp mplayerxp/libmpcodecs/dec_audio.cpp mplayerxp/libmpcodecs/dec_video.cpp mplayerxp/libmpcodecs/vd.cpp mplayerxp/libmpconf/cfgparser.cpp mplayerxp/libmpdemux/muxer.cpp mplayerxp/libmpsub/spudec.cpp mplayerxp/libplaytree/asxparser.cpp mplayerxp/libvo/font_load.cpp mplayerxp/libvo/img_format.cpp mplayerxp/libvo/screenshot.cpp mplayerxp/libvo/video_out.cpp mplayerxp/nls/recode.cpp mplayerxp/osdep/cpudetect.cpp mplayerxp/postproc/af.cpp mplayerxp/postproc/vf.cpp Removed Paths: ------------- mplayerxp/libao2/afmt.c mplayerxp/libao2/audio_out.c mplayerxp/libao2/mixer.c mplayerxp/libmpcodecs/ad.c mplayerxp/libmpcodecs/dec_audio.c mplayerxp/libmpcodecs/dec_video.c mplayerxp/libmpcodecs/vd.c mplayerxp/libmpconf/cfgparser.c mplayerxp/libmpdemux/muxer.c mplayerxp/libmpsub/spudec.c mplayerxp/libplaytree/asxparser.c mplayerxp/libvo/font_load.c mplayerxp/libvo/img_format.c mplayerxp/libvo/screenshot.c mplayerxp/libvo/video_out.c mplayerxp/nls/recode.c mplayerxp/osdep/cpudetect.c mplayerxp/postproc/af.c mplayerxp/postproc/vf.c Modified: mplayerxp/dump.cpp =================================================================== --- mplayerxp/dump.cpp 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/dump.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -6,7 +6,7 @@ #include <stdlib.h> #define __USE_ISOC99 1 /* for lrint */ #include <math.h> -extern "C"{ + #include "mp_config.h" #include "xmpcore/sig_hand.h" @@ -18,7 +18,7 @@ #include "osdep/mplib.h" #define MSGT_CLASS MSGT_GLOBAL #include "mp_msg.h" -} + #include "dump.h" static char *media=NULL,*port=NULL; Modified: mplayerxp/input2/input.cpp =================================================================== --- mplayerxp/input2/input.cpp 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/input2/input.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -9,7 +9,7 @@ #include <sys/time.h> #include <fcntl.h> #include <ctype.h> -extern "C" { + #include "input.h" #include "mouse.h" #ifdef MP_DEBUG @@ -23,7 +23,7 @@ #include "libmpconf/cfgparser.h" #include "in_msg.h" -} + #ifdef HAVE_LIRC #include "lirc.h" #endif Modified: mplayerxp/libao2/Makefile =================================================================== --- mplayerxp/libao2/Makefile 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/Makefile 2012-11-16 11:32:49 UTC (rev 384) @@ -4,7 +4,8 @@ LIBNAME = libao2.a # TODO: moveout ao_sdl.c so it's only used when SDL is detected -SRCS= audio_out.c afmt.c ao_null.c ao_wav.c mixer.c +CXXSRCS=audio_out.cpp mixer.cpp afmt.cpp +SRCS=ao_null.c ao_wav.c ifeq ($(HAVE_SDL),yes) SRCS+=ao_sdl.c endif @@ -30,10 +31,11 @@ SRCS+=ao_jack.c endif - OBJS=$(SRCS:.c=.o) +CXXOBJS=$(CXXSRCS:.cpp=.o) CFLAGS = $(OPTFLAGS) -I. -I.. -Wall +CXXFLAGS = $(OPTXXFLAGS) -I. -I.. -Wall .SUFFIXES: .c .o @@ -41,9 +43,11 @@ .c.o: $(CC) -c $(CFLAGS) -o $@ $< +.cpp.o: + $(CXX) -c $(CXXFLAGS) -o $@ $< -$(LIBNAME): $(OBJS) - $(AR) r $(LIBNAME) $(OBJS) +$(LIBNAME): $(OBJS) $(CXXOBJS) + $(AR) r $(LIBNAME) $(OBJS) $(CXXOBJS) all: $(LIBNAME) @@ -56,7 +60,7 @@ dep: depend depend: - $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend + $(CC) -MM $(CFLAGS) $(SRCS) $(CXXSRCS) 1>.depend # # include dependency files if they exist Deleted: mplayerxp/libao2/afmt.c =================================================================== --- mplayerxp/libao2/afmt.c 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/afmt.c 2012-11-16 11:32:49 UTC (rev 384) @@ -1,37 +0,0 @@ -#include "afmt.h" - -unsigned afmt2bps(unsigned fmt) { - unsigned rc; - switch (fmt) { - default: - case AFMT_U8: - case AFMT_S8: rc = 1; break; - case AFMT_S16_LE: - case AFMT_S16_BE: - case AFMT_U16_LE: - case AFMT_U16_BE: return 2; - case AFMT_S24_LE: - case AFMT_S24_BE: - case AFMT_U24_LE: - case AFMT_U24_BE: return 3; - case AFMT_FLOAT32: - case AFMT_S32_LE: - case AFMT_S32_BE: - case AFMT_U32_LE: - case AFMT_U32_BE: return 4; - } - return rc; -} - -/* very approximate prediction */ -unsigned bps2afmt(unsigned bps) { - unsigned rc; - switch (bps) { - default: - case 1: rc = AFMT_S8; break; - case 2: return AFMT_S16_LE; break; - case 3: return AFMT_S24_LE; break; - case 4: return AFMT_S32_LE; break; - } - return rc; -} \ No newline at end of file Copied: mplayerxp/libao2/afmt.cpp (from rev 369, mplayerxp/libao2/afmt.c) =================================================================== --- mplayerxp/libao2/afmt.cpp (rev 0) +++ mplayerxp/libao2/afmt.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -0,0 +1,37 @@ +#include "afmt.h" + +unsigned afmt2bps(unsigned fmt) { + unsigned rc; + switch (fmt) { + default: + case AFMT_U8: + case AFMT_S8: rc = 1; break; + case AFMT_S16_LE: + case AFMT_S16_BE: + case AFMT_U16_LE: + case AFMT_U16_BE: return 2; + case AFMT_S24_LE: + case AFMT_S24_BE: + case AFMT_U24_LE: + case AFMT_U24_BE: return 3; + case AFMT_FLOAT32: + case AFMT_S32_LE: + case AFMT_S32_BE: + case AFMT_U32_LE: + case AFMT_U32_BE: return 4; + } + return rc; +} + +/* very approximate prediction */ +unsigned bps2afmt(unsigned bps) { + unsigned rc; + switch (bps) { + default: + case 1: rc = AFMT_S8; break; + case 2: return AFMT_S16_LE; break; + case 3: return AFMT_S24_LE; break; + case 4: return AFMT_S32_LE; break; + } + return rc; +} \ No newline at end of file Modified: mplayerxp/libao2/afmt.h =================================================================== --- mplayerxp/libao2/afmt.h 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/afmt.h 2012-11-16 11:32:49 UTC (rev 384) @@ -46,7 +46,13 @@ # define AFMT_FLOAT32 0x00100000 +#ifdef __cplusplus +extern "C" { +#endif extern unsigned __FASTCALL__ afmt2bps(unsigned fmt); extern unsigned __FASTCALL__ bps2afmt(unsigned bps); /**< very approximate prediction */ +#ifdef __cplusplus +} +#endif #endif Deleted: mplayerxp/libao2/audio_out.c =================================================================== --- mplayerxp/libao2/audio_out.c 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/audio_out.c 2012-11-16 11:32:49 UTC (rev 384) @@ -1,299 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "mp_config.h" -#include "osdep/mplib.h" -#include "audio_out.h" -#include "afmt.h" -#include "ao_msg.h" - -extern const ao_functions_t audio_out_wav; -extern const ao_functions_t audio_out_null; -#ifdef USE_OSS_AUDIO -extern const ao_functions_t audio_out_oss; -#endif -#ifdef HAVE_ALSA -extern const ao_functions_t audio_out_alsa; -#endif -#ifdef HAVE_SDL -extern const ao_functions_t audio_out_sdl; -#endif -#ifdef HAVE_ARTS -extern const ao_functions_t audio_out_arts; -#endif -#ifdef HAVE_ESD -extern const ao_functions_t audio_out_esd; -#endif -#ifdef HAVE_OPENAL -extern const ao_functions_t audio_out_openal; -#endif -#ifdef HAVE_NAS -extern const ao_functions_t audio_out_nas; -#endif -#ifdef HAVE_JACK -extern const ao_functions_t audio_out_jack; -#endif - -static const ao_functions_t* audio_out_drivers[] = -{ -#ifdef USE_OSS_AUDIO - &audio_out_oss, -#endif -#ifdef HAVE_SDL - &audio_out_sdl, -#endif -#ifdef HAVE_ALSA - &audio_out_alsa, -#endif -#ifdef HAVE_ARTS - &audio_out_arts, -#endif -#ifdef HAVE_ESD - &audio_out_esd, -#endif -#ifdef HAVE_OPENAL - &audio_out_openal, -#endif -#ifdef HAVE_NAS - &audio_out_nas, -#endif -#ifdef HAVE_JACK - &audio_out_jack, -#endif - &audio_out_wav, - &audio_out_null, - NULL -}; - -typedef struct priv_s { - char antiviral_hole[RND_CHAR5]; - const ao_functions_t* audio_out; -}priv_t; - -char * __FASTCALL__ ao_format_name(int format) -{ - switch (format) - { - case AFMT_MU_LAW: - return("Mu-Law"); - case AFMT_A_LAW: - return("A-Law"); - case AFMT_IMA_ADPCM: - return("Ima-ADPCM"); - case AFMT_S8: - return("Signed 8-bit"); - case AFMT_U8: - return("Unsigned 8-bit"); - case AFMT_U16_LE: - return("Unsigned 16-bit (Little-Endian)"); - case AFMT_U16_BE: - return("Unsigned 16-bit (Big-Endian)"); - case AFMT_S16_LE: - return("Signed 16-bit (Little-Endian)"); - case AFMT_S16_BE: - return("Signed 16-bit (Big-Endian)"); - case AFMT_U24_LE: - return("Unsigned 24-bit (Little-Endian)"); - case AFMT_U24_BE: - return("Unsigned 24-bit (Big-Endian)"); - case AFMT_S24_LE: - return("Signed 24-bit (Little-Endian)"); - case AFMT_S24_BE: - return("Signed 24-bit (Big-Endian)"); - case AFMT_U32_LE: - return("Unsigned 32-bit (Little-Endian)"); - case AFMT_U32_BE: - return("Unsigned 32-bit (Big-Endian)"); - case AFMT_S32_LE: - return("Signed 32-bit (Little-Endian)"); - case AFMT_S32_BE: - return("Signed 32-bit (Big-Endian)"); - case AFMT_MPEG: - return("MPEG (2) audio"); - case AFMT_AC3: - return("AC3"); - case AFMT_FLOAT32: - return("Float32"); -/* - the following two formats are not available with old linux kernel - headers (e.g. in 2.2.16) -*/ - } - return("Unknown"); -} - -// return number of bits for 1 sample in one channel, or 8 bits for compressed -int __FASTCALL__ ao_format_bits(int format){ - switch (format) - { -/* - the following two formats are not available with old linux kernel - headers (e.g. in 2.2.16) -*/ -#ifdef AFMT_S32_LE - case AFMT_S32_LE: - case AFMT_U32_LE: - return 32; -#endif -#ifdef AFMT_S32_BE - case AFMT_S32_BE: - case AFMT_U32_BE: - return 32; -#endif -#ifdef AFMT_S24_LE - case AFMT_S24_LE: - case AFMT_U24_LE: - return 24; -#endif -#ifdef AFMT_S24_BE - case AFMT_S24_BE: - case AFMT_U24_BE: - return 24; -#endif - - case AFMT_U16_LE: - case AFMT_U16_BE: - case AFMT_S16_LE: - case AFMT_S16_BE: - return 16;//16 bits - - case AFMT_MU_LAW: - case AFMT_A_LAW: - case AFMT_IMA_ADPCM: - case AFMT_S8: - case AFMT_U8: - case AFMT_MPEG: - case AFMT_AC3: - default: - return 8;//default 1 byte - - } - return 8; -} - - -void ao_print_help( void ) -{ - unsigned i; - MSG_INFO("Available audio output drivers:\n"); - i=0; - while (audio_out_drivers[i]) { - const ao_info_t *info = audio_out_drivers[i++]->info; - MSG_INFO("\t%s\t%s\n", info->short_name, info->name); - } - MSG_INFO("\n"); -} - -MPXP_Rc __FASTCALL__ RND_RENAME4(ao_register)(ao_data_t* ao,const char *driver_name,unsigned flags) -{ - priv_t* priv=ao->opaque; - unsigned i; - if(!driver_name) - priv->audio_out=audio_out_drivers[0]; - else - for (i=0; audio_out_drivers[i] != &audio_out_null; i++) { - const ao_info_t *info = audio_out_drivers[i]->info; - if(strcmp(info->short_name,driver_name) == 0){ - priv->audio_out = audio_out_drivers[i];break; - } - } - if(priv->audio_out->init(ao,flags)==MPXP_Ok) return MPXP_Ok; - return MPXP_False; -} - -const ao_info_t* ao_get_info( const ao_data_t* ao ) -{ - priv_t* priv=ao->opaque; - return priv->audio_out->info; -} - -ao_data_t* __FASTCALL__ RND_RENAME5(ao_init)(const char *subdevice) -{ - ao_data_t* ao; - ao=mp_mallocz(sizeof(ao_data_t)); - if(subdevice) ao->subdevice=mp_strdup(subdevice); - ao->outburst=OUTBURST; - ao->buffersize=-1; - ao->opaque=mp_malloc(sizeof(priv_t)); - priv_t* priv=ao->opaque; - SECURE_NAME9(rnd_fill)(priv->antiviral_hole,sizeof(priv_t)); - SECURE_NAME9(rnd_fill)(ao->antiviral_hole,offsetof(ao_data_t,samplerate)-offsetof(ao_data_t,antiviral_hole)); - priv->audio_out=NULL; - return ao; -} - -MPXP_Rc __FASTCALL__ ao_configure(ao_data_t*ao,unsigned rate,unsigned channels,unsigned format) -{ - priv_t* priv=ao->opaque; - return priv->audio_out->configure(ao,rate,channels,format); -} - -void ao_uninit(ao_data_t*ao) -{ - priv_t* priv=ao->opaque; - priv->audio_out->uninit(ao); - if(ao->subdevice) mp_free(ao->subdevice); - mp_free(priv); - mp_free(ao); - ao=NULL; -} - -void ao_reset(ao_data_t*ao) -{ - if(ao) { - priv_t* priv=ao->opaque; - priv->audio_out->reset(ao); - } -} - -unsigned ao_get_space(const ao_data_t*ao) -{ - if(ao) { - priv_t* priv=ao->opaque; - return priv->audio_out->get_space(ao); - } - return 0; -} - -float ao_get_delay(const ao_data_t*ao) -{ - if(ao) { - priv_t* priv=ao->opaque; - return priv->audio_out->get_delay(ao); - } - return 0; -} - -unsigned __FASTCALL__ RND_RENAME6(ao_play)(ao_data_t*ao,const any_t* data,unsigned len,unsigned flags) -{ - if(ao) { - priv_t* priv=ao->opaque; - return priv->audio_out->play(ao,data,len,flags); - } return 0; -} - -void ao_pause(ao_data_t*ao) -{ - if(ao) { - priv_t* priv=ao->opaque; - priv->audio_out->pause(ao); - } -} - -void ao_resume(ao_data_t*ao) -{ - if(ao) { - priv_t* priv=ao->opaque; - priv->audio_out->resume(ao); - } -} - -MPXP_Rc __FASTCALL__ RND_RENAME7(ao_control)(const ao_data_t*ao,int cmd,long arg) -{ - if(ao) { - priv_t* priv=ao->opaque; - return priv->audio_out->control(ao,cmd,arg); - } - return MPXP_Error; -} Copied: mplayerxp/libao2/audio_out.cpp (from rev 372, mplayerxp/libao2/audio_out.c) =================================================================== --- mplayerxp/libao2/audio_out.cpp (rev 0) +++ mplayerxp/libao2/audio_out.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -0,0 +1,299 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "mp_config.h" +#include "osdep/mplib.h" +#include "audio_out.h" +#include "afmt.h" +#include "ao_msg.h" + +extern const ao_functions_t audio_out_wav; +extern const ao_functions_t audio_out_null; +#ifdef USE_OSS_AUDIO +extern const ao_functions_t audio_out_oss; +#endif +#ifdef HAVE_ALSA +extern const ao_functions_t audio_out_alsa; +#endif +#ifdef HAVE_SDL +extern const ao_functions_t audio_out_sdl; +#endif +#ifdef HAVE_ARTS +extern const ao_functions_t audio_out_arts; +#endif +#ifdef HAVE_ESD +extern const ao_functions_t audio_out_esd; +#endif +#ifdef HAVE_OPENAL +extern const ao_functions_t audio_out_openal; +#endif +#ifdef HAVE_NAS +extern const ao_functions_t audio_out_nas; +#endif +#ifdef HAVE_JACK +extern const ao_functions_t audio_out_jack; +#endif + +static const ao_functions_t* audio_out_drivers[] = +{ +#ifdef USE_OSS_AUDIO + &audio_out_oss, +#endif +#ifdef HAVE_SDL + &audio_out_sdl, +#endif +#ifdef HAVE_ALSA + &audio_out_alsa, +#endif +#ifdef HAVE_ARTS + &audio_out_arts, +#endif +#ifdef HAVE_ESD + &audio_out_esd, +#endif +#ifdef HAVE_OPENAL + &audio_out_openal, +#endif +#ifdef HAVE_NAS + &audio_out_nas, +#endif +#ifdef HAVE_JACK + &audio_out_jack, +#endif + &audio_out_wav, + &audio_out_null, + NULL +}; + +typedef struct priv_s { + char antiviral_hole[RND_CHAR5]; + const ao_functions_t* audio_out; +}priv_t; + +const char * __FASTCALL__ ao_format_name(int format) +{ + switch (format) + { + case AFMT_MU_LAW: + return("Mu-Law"); + case AFMT_A_LAW: + return("A-Law"); + case AFMT_IMA_ADPCM: + return("Ima-ADPCM"); + case AFMT_S8: + return("Signed 8-bit"); + case AFMT_U8: + return("Unsigned 8-bit"); + case AFMT_U16_LE: + return("Unsigned 16-bit (Little-Endian)"); + case AFMT_U16_BE: + return("Unsigned 16-bit (Big-Endian)"); + case AFMT_S16_LE: + return("Signed 16-bit (Little-Endian)"); + case AFMT_S16_BE: + return("Signed 16-bit (Big-Endian)"); + case AFMT_U24_LE: + return("Unsigned 24-bit (Little-Endian)"); + case AFMT_U24_BE: + return("Unsigned 24-bit (Big-Endian)"); + case AFMT_S24_LE: + return("Signed 24-bit (Little-Endian)"); + case AFMT_S24_BE: + return("Signed 24-bit (Big-Endian)"); + case AFMT_U32_LE: + return("Unsigned 32-bit (Little-Endian)"); + case AFMT_U32_BE: + return("Unsigned 32-bit (Big-Endian)"); + case AFMT_S32_LE: + return("Signed 32-bit (Little-Endian)"); + case AFMT_S32_BE: + return("Signed 32-bit (Big-Endian)"); + case AFMT_MPEG: + return("MPEG (2) audio"); + case AFMT_AC3: + return("AC3"); + case AFMT_FLOAT32: + return("Float32"); +/* + the following two formats are not available with old linux kernel + headers (e.g. in 2.2.16) +*/ + } + return("Unknown"); +} + +// return number of bits for 1 sample in one channel, or 8 bits for compressed +int __FASTCALL__ ao_format_bits(int format){ + switch (format) + { +/* + the following two formats are not available with old linux kernel + headers (e.g. in 2.2.16) +*/ +#ifdef AFMT_S32_LE + case AFMT_S32_LE: + case AFMT_U32_LE: + return 32; +#endif +#ifdef AFMT_S32_BE + case AFMT_S32_BE: + case AFMT_U32_BE: + return 32; +#endif +#ifdef AFMT_S24_LE + case AFMT_S24_LE: + case AFMT_U24_LE: + return 24; +#endif +#ifdef AFMT_S24_BE + case AFMT_S24_BE: + case AFMT_U24_BE: + return 24; +#endif + + case AFMT_U16_LE: + case AFMT_U16_BE: + case AFMT_S16_LE: + case AFMT_S16_BE: + return 16;//16 bits + + case AFMT_MU_LAW: + case AFMT_A_LAW: + case AFMT_IMA_ADPCM: + case AFMT_S8: + case AFMT_U8: + case AFMT_MPEG: + case AFMT_AC3: + default: + return 8;//default 1 byte + + } + return 8; +} + + +void ao_print_help( void ) +{ + unsigned i; + MSG_INFO("Available audio output drivers:\n"); + i=0; + while (audio_out_drivers[i]) { + const ao_info_t *info = audio_out_drivers[i++]->info; + MSG_INFO("\t%s\t%s\n", info->short_name, info->name); + } + MSG_INFO("\n"); +} + +MPXP_Rc __FASTCALL__ RND_RENAME4(ao_register)(ao_data_t* ao,const char *driver_name,unsigned flags) +{ + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + unsigned i; + if(!driver_name) + priv->audio_out=audio_out_drivers[0]; + else + for (i=0; audio_out_drivers[i] != &audio_out_null; i++) { + const ao_info_t *info = audio_out_drivers[i]->info; + if(strcmp(info->short_name,driver_name) == 0){ + priv->audio_out = audio_out_drivers[i];break; + } + } + if(priv->audio_out->init(ao,flags)==MPXP_Ok) return MPXP_Ok; + return MPXP_False; +} + +const ao_info_t* ao_get_info( const ao_data_t* ao ) +{ + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->info; +} + +ao_data_t* __FASTCALL__ RND_RENAME5(ao_init)(const char *subdevice) +{ + ao_data_t* ao; + ao=new(zeromem) ao_data_t; + if(subdevice) ao->subdevice=mp_strdup(subdevice); + ao->outburst=OUTBURST; + ao->buffersize=-1; + ao->opaque=mp_malloc(sizeof(priv_t)); + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + SECURE_NAME9(rnd_fill)(priv->antiviral_hole,sizeof(priv_t)); + SECURE_NAME9(rnd_fill)(ao->antiviral_hole,offsetof(ao_data_t,samplerate)-offsetof(ao_data_t,antiviral_hole)); + priv->audio_out=NULL; + return ao; +} + +MPXP_Rc __FASTCALL__ ao_configure(ao_data_t*ao,unsigned rate,unsigned channels,unsigned format) +{ + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->configure(ao,rate,channels,format); +} + +void ao_uninit(ao_data_t*ao) +{ + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + priv->audio_out->uninit(ao); + if(ao->subdevice) delete ao->subdevice; + delete priv; + delete ao; + ao=NULL; +} + +void ao_reset(ao_data_t*ao) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + priv->audio_out->reset(ao); + } +} + +unsigned ao_get_space(const ao_data_t*ao) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->get_space(ao); + } + return 0; +} + +float ao_get_delay(const ao_data_t*ao) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->get_delay(ao); + } + return 0; +} + +unsigned __FASTCALL__ RND_RENAME6(ao_play)(ao_data_t*ao,const any_t* data,unsigned len,unsigned flags) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->play(ao,data,len,flags); + } return 0; +} + +void ao_pause(ao_data_t*ao) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + priv->audio_out->pause(ao); + } +} + +void ao_resume(ao_data_t*ao) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + priv->audio_out->resume(ao); + } +} + +MPXP_Rc __FASTCALL__ RND_RENAME7(ao_control)(const ao_data_t*ao,int cmd,long arg) +{ + if(ao) { + priv_t* priv=reinterpret_cast<priv_t*>(ao->opaque); + return priv->audio_out->control(ao,cmd,arg); + } + return MPXP_Error; +} Modified: mplayerxp/libao2/audio_out.h =================================================================== --- mplayerxp/libao2/audio_out.h 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/audio_out.h 2012-11-16 11:32:49 UTC (rev 384) @@ -100,7 +100,7 @@ } ao_control_vol_t; /* prototypes */ -extern char * __FASTCALL__ ao_format_name(int format); +extern const char * __FASTCALL__ ao_format_name(int format); extern int __FASTCALL__ ao_format_bits(int format); extern void ao_print_help( void ); Deleted: mplayerxp/libao2/mixer.c =================================================================== --- mplayerxp/libao2/mixer.c 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libao2/mixer.c 2012-11-16 11:32:49 UTC (rev 384) @@ -1,69 +0,0 @@ -#include <string.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <stdio.h> -#include <unistd.h> - -#include "mp_config.h" -#include "mixer.h" -#include "libao2/audio_out.h" - -void mixer_getvolume(const ao_data_t* ao, float *l,float *r ) -{ - ao_control_vol_t vol; - *l=0; *r=0; - if(MPXP_Ok != RND_RENAME7(ao_control)(ao,AOCONTROL_GET_VOLUME,(long)&vol)) return; - *r=vol.right; - *l=vol.left; -} - -void mixer_setvolume(const ao_data_t* ao,float l,float r ) -{ - ao_control_vol_t vol; - vol.right=r; vol.left=l; - RND_RENAME7(ao_control)(ao,AOCONTROL_SET_VOLUME,(long)&vol); -} - -#define MIXER_CHANGE 3 - -void mixer_incvolume(const ao_data_t* ao) -{ - float mixer_l, mixer_r; - mixer_getvolume(ao, &mixer_l,&mixer_r ); - mixer_l += MIXER_CHANGE; - if ( mixer_l > 100 ) mixer_l = 100; - mixer_r += MIXER_CHANGE; - if ( mixer_r > 100 ) mixer_r = 100; - mixer_setvolume(ao, mixer_l,mixer_r ); -} - -void mixer_decvolume(const ao_data_t* ao) -{ - float mixer_l, mixer_r; - mixer_getvolume(ao, &mixer_l,&mixer_r ); - mixer_l -= MIXER_CHANGE; - if ( mixer_l < 0 ) mixer_l = 0; - mixer_r -= MIXER_CHANGE; - if ( mixer_r < 0 ) mixer_r = 0; - mixer_setvolume(ao, mixer_l,mixer_r ); -} - -float mixer_getbothvolume(const ao_data_t* ao) -{ - float mixer_l, mixer_r; - mixer_getvolume(ao, &mixer_l,&mixer_r ); - return ( mixer_l + mixer_r ) / 2; -} - -static int muted=0; -static float mute_l,mute_r; -void mixer_mute(const ao_data_t* ao) -{ - if ( muted ) { mixer_setvolume(ao, mute_l,mute_r ); muted=0; } - else - { - mixer_getvolume(ao, &mute_l,&mute_r ); - mixer_setvolume(ao, 0,0 ); - muted=1; - } -} Copied: mplayerxp/libao2/mixer.cpp (from rev 369, mplayerxp/libao2/mixer.c) =================================================================== --- mplayerxp/libao2/mixer.cpp (rev 0) +++ mplayerxp/libao2/mixer.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -0,0 +1,69 @@ +#include <string.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <stdio.h> +#include <unistd.h> + +#include "mp_config.h" +#include "mixer.h" +#include "libao2/audio_out.h" + +void mixer_getvolume(const ao_data_t* ao, float *l,float *r ) +{ + ao_control_vol_t vol; + *l=0; *r=0; + if(MPXP_Ok != RND_RENAME7(ao_control)(ao,AOCONTROL_GET_VOLUME,(long)&vol)) return; + *r=vol.right; + *l=vol.left; +} + +void mixer_setvolume(const ao_data_t* ao,float l,float r ) +{ + ao_control_vol_t vol; + vol.right=r; vol.left=l; + RND_RENAME7(ao_control)(ao,AOCONTROL_SET_VOLUME,(long)&vol); +} + +#define MIXER_CHANGE 3 + +void mixer_incvolume(const ao_data_t* ao) +{ + float mixer_l, mixer_r; + mixer_getvolume(ao, &mixer_l,&mixer_r ); + mixer_l += MIXER_CHANGE; + if ( mixer_l > 100 ) mixer_l = 100; + mixer_r += MIXER_CHANGE; + if ( mixer_r > 100 ) mixer_r = 100; + mixer_setvolume(ao, mixer_l,mixer_r ); +} + +void mixer_decvolume(const ao_data_t* ao) +{ + float mixer_l, mixer_r; + mixer_getvolume(ao, &mixer_l,&mixer_r ); + mixer_l -= MIXER_CHANGE; + if ( mixer_l < 0 ) mixer_l = 0; + mixer_r -= MIXER_CHANGE; + if ( mixer_r < 0 ) mixer_r = 0; + mixer_setvolume(ao, mixer_l,mixer_r ); +} + +float mixer_getbothvolume(const ao_data_t* ao) +{ + float mixer_l, mixer_r; + mixer_getvolume(ao, &mixer_l,&mixer_r ); + return ( mixer_l + mixer_r ) / 2; +} + +static int muted=0; +static float mute_l,mute_r; +void mixer_mute(const ao_data_t* ao) +{ + if ( muted ) { mixer_setvolume(ao, mute_l,mute_r ); muted=0; } + else + { + mixer_getvolume(ao, &mute_l,&mute_r ); + mixer_setvolume(ao, 0,0 ); + muted=1; + } +} Modified: mplayerxp/libmpcodecs/Makefile =================================================================== --- mplayerxp/libmpcodecs/Makefile 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libmpcodecs/Makefile 2012-11-16 11:32:49 UTC (rev 384) @@ -5,9 +5,9 @@ DO_MAKE = @ for i in $(SUBDIRS); do $(MAKE) -C $$i $@ || exit; done DO_ALL = @ for i in $(SUBDIRS); do $(MAKE) -C $$i all || exit; done -SRCS=dec_video.c \ - vd.c \ - vd_null.c \ +CXXSRCS=dec_video.cpp vd.cpp ad.cpp dec_audio.cpp + +SRCS=vd_null.c \ vd_ffmpeg.c \ vd_raw.c \ vd_nuv.c \ @@ -15,8 +15,6 @@ vd_xvid.c \ vd_mpegpes.c \ vd_huffyuv.c \ - ad.c \ - dec_audio.c \ ad_null.c \ ad_ffmpeg.c \ ad_mp3.c \ @@ -57,8 +55,10 @@ endif OBJS=$(SRCS:.c=.o) +CXXOBJS=$(CXXSRCS:.cpp=.o) CFLAGS = $(OPTFLAGS) -I. -I.. -Wall +CXXFLAGS = $(OPTXXFLAGS) -I. -I.. -Wall .SUFFIXES: .c .o @@ -71,9 +71,11 @@ .c.o: $(CC) -c $(CFLAGS) -o $@ $< +.cpp.o: + $(CXX) -c $(CXXFLAGS) -o $@ $< -$(LIBNAME): $(SUBDIRS) $(OBJS) - $(AR) r $(LIBNAME) $(OBJS) \ +$(LIBNAME): $(SUBDIRS) $(OBJS) $(CXXOBJS) + $(AR) r $(LIBNAME) $(OBJS) $(CXXOBJS) \ $(wildcard libnuppelvideo/*.o) \ $(wildcard liba52/*.o) \ $(wildcard libdca/*.o) @@ -91,7 +93,7 @@ depend: $(DO_MAKE) - $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend + $(CC) -MM $(CFLAGS) $(SRCS) $(CXXSRCS) 1>.depend # # include dependency files if they exist Deleted: mplayerxp/libmpcodecs/ad.c =================================================================== --- mplayerxp/libmpcodecs/ad.c 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libmpcodecs/ad.c 2012-11-16 11:32:49 UTC (rev 384) @@ -1,107 +0,0 @@ -/* - ad.c - audio decoder interface -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "mp_config.h" - -#include "libmpdemux/stream.h" -#include "libmpdemux/demuxer.h" -#include "libmpdemux/stheader.h" -#include "ad.h" -#include "ad_msg.h" - -/* Missed vorbis, mad, dshow */ - -extern const ad_functions_t mpcodecs_ad_null; -extern const ad_functions_t mpcodecs_ad_mp3; -extern const ad_functions_t mpcodecs_ad_ffmpeg; -extern const ad_functions_t mpcodecs_ad_a52; -extern const ad_functions_t mpcodecs_ad_dca; -extern const ad_functions_t mpcodecs_ad_hwac3; -extern const ad_functions_t mpcodecs_ad_pcm; -extern const ad_functions_t mpcodecs_ad_libdv; -extern const ad_functions_t mpcodecs_ad_dvdpcm; -extern const ad_functions_t mpcodecs_ad_dshow; -extern const ad_functions_t mpcodecs_ad_msacm; -extern const ad_functions_t mpcodecs_ad_faad; -extern const ad_functions_t mpcodecs_ad_vorbis; -extern const ad_functions_t mpcodecs_ad_real; -extern const ad_functions_t mpcodecs_ad_twin; -extern const ad_functions_t mpcodecs_ad_dmo; -extern const ad_functions_t mpcodecs_ad_qtaudio; - -static const ad_functions_t* mpcodecs_ad_drivers[] = { - &mpcodecs_ad_mp3, - &mpcodecs_ad_a52, - &mpcodecs_ad_dca, - &mpcodecs_ad_hwac3, - &mpcodecs_ad_pcm, - &mpcodecs_ad_dvdpcm, - &mpcodecs_ad_faad, -#ifdef HAVE_LIBVORBIS - &mpcodecs_ad_vorbis, -#endif -#ifdef HAVE_LIBDV - &mpcodecs_ad_libdv, -#endif -#ifndef ENABLE_GPL_ONLY - &mpcodecs_ad_real, -#endif -#ifdef ENABLE_WIN32LOADER - &mpcodecs_ad_dshow, - &mpcodecs_ad_twin, - &mpcodecs_ad_msacm, - &mpcodecs_ad_dmo, - &mpcodecs_ad_qtaudio, -#endif - &mpcodecs_ad_ffmpeg, - &mpcodecs_ad_null, - -}; - -static unsigned int nddrivers=sizeof(mpcodecs_ad_drivers)/sizeof(ad_functions_t*); - -void libmpcodecs_ad_register_options(m_config_t* cfg) -{ - unsigned i; - for(i=0;i<nddrivers;i++) { - if(mpcodecs_ad_drivers[i]) - if(mpcodecs_ad_drivers[i]->options) - m_config_register_options(cfg,mpcodecs_ad_drivers[i]->options); - if(mpcodecs_ad_drivers[i]==&mpcodecs_ad_null) break; - } -} - -const ad_functions_t* afm_find_driver(const char *name) { - unsigned i; - for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { - if(strcmp(mpcodecs_ad_drivers[i]->info->driver_name,name)==0){ - return mpcodecs_ad_drivers[i]; - } - } - return NULL; -} - -const audio_probe_t* afm_probe_driver(sh_audio_t *sh) { - unsigned i; - const audio_probe_t* rv; - for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { - if((rv=mpcodecs_ad_drivers[i]->probe(sh,sh->wtag))!=NULL) return rv; - } - return NULL; -} - -void afm_help(void) { - unsigned i; - MSG_INFO("Available audio codec families/drivers:\n"); - for(i=0;i<nddrivers;i++) { - if(mpcodecs_ad_drivers[i]) - if(mpcodecs_ad_drivers[i]->options) - MSG_INFO("\t%-10s %s\n",mpcodecs_ad_drivers[i]->info->driver_name,mpcodecs_ad_drivers[i]->info->descr); - } - MSG_INFO("\n"); -} Copied: mplayerxp/libmpcodecs/ad.cpp (from rev 369, mplayerxp/libmpcodecs/ad.c) =================================================================== --- mplayerxp/libmpcodecs/ad.cpp (rev 0) +++ mplayerxp/libmpcodecs/ad.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -0,0 +1,107 @@ +/* + ad.c - audio decoder interface +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "mp_config.h" + +#include "libmpdemux/stream.h" +#include "libmpdemux/demuxer.h" +#include "libmpdemux/stheader.h" +#include "ad.h" +#include "ad_msg.h" + +/* Missed vorbis, mad, dshow */ + +extern const ad_functions_t mpcodecs_ad_null; +extern const ad_functions_t mpcodecs_ad_mp3; +extern const ad_functions_t mpcodecs_ad_ffmpeg; +extern const ad_functions_t mpcodecs_ad_a52; +extern const ad_functions_t mpcodecs_ad_dca; +extern const ad_functions_t mpcodecs_ad_hwac3; +extern const ad_functions_t mpcodecs_ad_pcm; +extern const ad_functions_t mpcodecs_ad_libdv; +extern const ad_functions_t mpcodecs_ad_dvdpcm; +extern const ad_functions_t mpcodecs_ad_dshow; +extern const ad_functions_t mpcodecs_ad_msacm; +extern const ad_functions_t mpcodecs_ad_faad; +extern const ad_functions_t mpcodecs_ad_vorbis; +extern const ad_functions_t mpcodecs_ad_real; +extern const ad_functions_t mpcodecs_ad_twin; +extern const ad_functions_t mpcodecs_ad_dmo; +extern const ad_functions_t mpcodecs_ad_qtaudio; + +static const ad_functions_t* mpcodecs_ad_drivers[] = { + &mpcodecs_ad_mp3, + &mpcodecs_ad_a52, + &mpcodecs_ad_dca, + &mpcodecs_ad_hwac3, + &mpcodecs_ad_pcm, + &mpcodecs_ad_dvdpcm, + &mpcodecs_ad_faad, +#ifdef HAVE_LIBVORBIS + &mpcodecs_ad_vorbis, +#endif +#ifdef HAVE_LIBDV + &mpcodecs_ad_libdv, +#endif +#ifndef ENABLE_GPL_ONLY + &mpcodecs_ad_real, +#endif +#ifdef ENABLE_WIN32LOADER + &mpcodecs_ad_dshow, + &mpcodecs_ad_twin, + &mpcodecs_ad_msacm, + &mpcodecs_ad_dmo, + &mpcodecs_ad_qtaudio, +#endif + &mpcodecs_ad_ffmpeg, + &mpcodecs_ad_null, + +}; + +static unsigned int nddrivers=sizeof(mpcodecs_ad_drivers)/sizeof(ad_functions_t*); + +void libmpcodecs_ad_register_options(m_config_t* cfg) +{ + unsigned i; + for(i=0;i<nddrivers;i++) { + if(mpcodecs_ad_drivers[i]) + if(mpcodecs_ad_drivers[i]->options) + m_config_register_options(cfg,mpcodecs_ad_drivers[i]->options); + if(mpcodecs_ad_drivers[i]==&mpcodecs_ad_null) break; + } +} + +const ad_functions_t* afm_find_driver(const char *name) { + unsigned i; + for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { + if(strcmp(mpcodecs_ad_drivers[i]->info->driver_name,name)==0){ + return mpcodecs_ad_drivers[i]; + } + } + return NULL; +} + +const audio_probe_t* afm_probe_driver(sh_audio_t *sh) { + unsigned i; + const audio_probe_t* rv; + for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { + if((rv=mpcodecs_ad_drivers[i]->probe(sh,sh->wtag))!=NULL) return rv; + } + return NULL; +} + +void afm_help(void) { + unsigned i; + MSG_INFO("Available audio codec families/drivers:\n"); + for(i=0;i<nddrivers;i++) { + if(mpcodecs_ad_drivers[i]) + if(mpcodecs_ad_drivers[i]->options) + MSG_INFO("\t%-10s %s\n",mpcodecs_ad_drivers[i]->info->driver_name,mpcodecs_ad_drivers[i]->info->descr); + } + MSG_INFO("\n"); +} Modified: mplayerxp/libmpcodecs/ad.h =================================================================== --- mplayerxp/libmpcodecs/ad.h 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libmpcodecs/ad.h 2012-11-16 11:32:49 UTC (rev 384) @@ -7,6 +7,9 @@ #include "libmpconf/cfgparser.h" #include "xmpcore/xmp_enums.h" #include "libao2/afmt.h" +#ifdef __cplusplus +extern "C" { +#endif typedef struct ad_info_s { @@ -56,5 +59,8 @@ extern const ad_functions_t* afm_find_driver(const char *name); extern const audio_probe_t* afm_probe_driver(sh_audio_t* sh); #define FIX_APTS(sh_audio,pts,in_size) (sh_audio->i_bps?((float)(pts)+(float)(in_size)/(float)sh_audio->i_bps):((float)(pts))) +#ifdef __cplusplus +} +#endif #endif Deleted: mplayerxp/libmpcodecs/dec_audio.c =================================================================== --- mplayerxp/libmpcodecs/dec_audio.c 2012-11-16 07:53:58 UTC (rev 383) +++ mplayerxp/libmpcodecs/dec_audio.c 2012-11-16 11:32:49 UTC (rev 384) @@ -1,382 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "mp_config.h" -#include "help_mp.h" - -#include "mplayerxp.h" -#include "xmpcore/xmp_core.h" - -#include "libmpdemux/stream.h" -#include "libmpdemux/demuxer.h" -#include "libmpdemux/stheader.h" -#include "libmpconf/codec-cfg.h" - -#include "dec_audio.h" -#include "libao2/afmt.h" -#include "libao2/audio_out.h" -#include "mplayerxp.h" -#include "libmpdemux/demuxer_r.h" -#include "postproc/af.h" -#include "osdep/fastmemcpy.h" -#include "osdep/mplib.h" -#include "ad_msg.h" - -/* used for ac3surround decoder - set using -channels option */ -af_cfg_t af_cfg; // Configuration for audio filters - -typedef struct priv_s { - sh_audio_t* parent; - const ad_functions_t* mpadec; -}priv_t; - -any_t* RND_RENAME2(mpca_init)(sh_audio_t *sh_audio) -{ - const char *afm,*ac; - const audio_probe_t* aprobe=NULL; - priv_t* priv = mp_mallocz(sizeof(priv_t)); - priv->parent=sh_audio; - if(!sh_audio->codec) { - if(mp_conf.audio_family) { - afm=mp_conf.audio_family; - ac=afm; - priv->mpadec=afm_find_driver(afm); - if(priv->mpadec) aprobe=priv->mpadec->probe(sh_audio,sh_audio->wtag); - } - else aprobe = afm_probe_driver(sh_audio); - } - if(aprobe) { - afm=aprobe->driver; - ac=aprobe->codec_dll; - /* fake struct codecs_st*/ - sh_audio->codec=mp_malloc(sizeof(struct codecs_st)); - strcpy(sh_audio->codec->dll_name,aprobe->codec_dll); - strcpy(sh_audio->codec->driver_name,aprobe->driver); - strcpy(sh_audio->codec->codec_name,sh_audio->codec->dll_name); - memcpy(sh_audio->codec->outfmt,aprobe->sample_fmt,sizeof(aprobe->sample_fmt)); - priv->mpadec=afm_find_driver(afm); - } - else if(sh_audio->codec) { - afm=sh_audio->codec->driver_name; - ac=sh_audio->codec->codec_name; - priv->mpadec=afm_find_driver(afm); - } - if(!priv->mpadec){ - MSG_ERR(MSGTR_CODEC_BAD_AFAMILY,ac, afm); - mp_free(priv); - return NULL; // no such driver - } - - /* reset in/out buffer size/pointer: */ - sh_audio->a_buffer_size=0; - sh_audio->a_buffer=NULL; - sh_audio->a_in_buffer_size=0; - sh_audio->a_in_buffer=NULL; - - /* Set up some common usefull defaults. ad->preinit() can override these: */ -#ifdef WORDS_BIGENDIAN - sh_audio->afmt=AFMT_S16_BE; -#else - sh_audio->afmt=AFMT_S16_LE; -#endif - sh_audio->rate=0; - sh_audio->o_bps=0; - if(sh_audio->wf) /* NK: We need to know i_bps before its detection by codecs param */ - sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; - - sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ - sh_audio->audio_in_minsize=0; - - if(priv->mpadec->preinit(sh_audio)!=MPXP_Ok) { - MSG_ERR(MSGTR_CODEC_CANT_PREINITA); - mp_free(priv); - return NULL; - } - - /* allocate audio in buffer: */ - if(sh_audio->audio_in_minsize>0){ - sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; - MSG_V("dec_audio: Allocating %d bytes for input buffer\n", - sh_audio->a_in_buffer_size); - sh_audio->a_in_buffer=mp_mallocz(sh_audio->a_in_buffer_size); - sh_audio->a_in_buffer_len=0; - } - - /* allocate audio out buffer: */ - sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/ - - MSG_V("dec_audio: Allocating %d + %d = %d bytes for output buffer\n", - sh_audio->audio_out_minsize,MAX_OUTBURST,sh_audio->a_buffer_size); - - sh_audio->a_buffer=mp_mallocz(sh_audio->a_buffer_size); - if(!sh_audio->a_buffer) { - MSG_ERR(MSGTR_CantAllocAudioBuf); - mp_free(priv); - return NULL; - } - sh_audio->a_buffer_len=0; - - if(priv->mpadec->init(sh_audio)!=MPXP_Ok){ - MSG_WARN(MSGTR_CODEC_CANT_INITA); - mpca_uninit(priv); /* mp_free buffers */ - return NULL; - } - - sh_audio->inited=1; - - if(!sh_audio->nch || !sh_audio->rate) { - MSG_WARN(MSGTR_UnknownAudio); - mpca_uninit(priv); /* mp_free buffers */ - return NULL; - } - - if(!sh_audio->o_bps) - sh_audio->o_bps=sh_audio->nch*sh_audio->rate*afmt2bps(sh_audio->afmt); - if(!sh_audio->i_bps) { - static int warned=0; - if(!warned) { - warned=1; - MSG_WARN(MSGTR_CODEC_INITAL_AV_RESYNC); - } - } else if(xp_core->initial_apts_corr.need_correction==1) { - xp_core->initial_apts += ((float)(xp_core->initial_apts_corr.pts_bytes-xp_core->initial_apts_corr.nbytes))/(float)sh_audio->i_bps; - xp_core->initial_apts_corr.need_correction=0; - } - MSG_OK("[AC] %s decoder: [%s] drv:%s.%s ratio %i->%i\n",mp_conf.audio_codec?"Forcing":"Selecting" - ,ac - ,priv->mpadec->info->driver_name - ,ac - ,sh_audio->i_bps,sh_audio->o_bps); - if(sh_audio->codec) { mp_free(sh_audio->codec); sh_audio->codec=NULL; } - return priv; -} - -void mpca_uninit(any_t *opaque) -{ - priv_t* priv = (priv_t*)opaque; - sh_audio_t* parent = priv->parent; - if(!parent) { mp_free(priv); return; } - if(priv->parent->afilter){ - MSG_V("Uninit audio filters...\n"); - af_uninit(parent->afilter); - mp_free(parent->afilter); - parent->afilter=NULL; - } - if(parent->a_buffer) mp_free(parent->a_buffer); - parent->a_buffer=NULL; - if(parent->a_in_buffer) mp_free(parent->a_in_buffer); - parent->a_in_buffer=NULL; - if(!parent->inited) { mp_free(priv); return; } - MSG_V("uninit audio: ...\n"); - priv->mpadec->uninit(parent); - if(parent->a_buffer) mp_free(parent->a_buffer); - parent->a_buffer=NULL; - parent->inited=0; - mp_free(priv); -} - - /* Init audio filters */ -MPXP_Rc mpca_preinit_filters(sh_audio_t *sh_audio, - unsigned in_samplerate, unsigned in_channels, unsigned in_format, - unsigned* out_samplerate, unsigned* out_channels, unsigned* out_format){ - char strbuf[200]; - af_stream_t* afs=RND_RENAME6(af_new)(sh_audio); - - // input format: same as codec's output format: - afs->input.rate = in_samplerate; - afs->input.nch = in_channels; - afs->input.format = mpaf_format_decode(in_format); - - // output format: same as ao driver's input format (if missing, fallback to input) - afs->output.rate = *out_samplerate ? *out_samplerate : afs->input.rate; - afs->output.nch = *out_channels ? *out_channels : afs->input.nch; - if(*out_format) afs->output.format = mpaf_format_decode(*out_format); - else afs->output.format = afs->input.format; - - // filter config: - memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t)); - - MSG_V("Checking audio filter chain for %dHz/%dch/%dbit...\n", - afs->input.rate,afs->input.nch,(afs->input.format&MPAF_BPS_MASK)*8); - - // let's autoprobe it! - if(MPXP_Ok != RND_RENAME7(af_init)(afs,0)){ - mp_free(afs); - return MPXP_False; // failed :( - } - - *out_samplerate=afs->output.rate; - *out_channels=afs->output.nch; - *out_format=mpaf_format_encode(afs->output.format); - - sh_audio->af_bps = afs->output.rate*afs->output.nch*(afs->output.format&MPAF_BPS_MASK); - - MSG_V("AF_pre: af format: %d ch, %d hz, %s af_bps=%i\n", - afs->output.nch, afs->output.rate, - mpaf_fmt2str(afs->output.format,strbuf,200), - sh_audio->af_bps); - - sh_audio->afilter=(any_t*)afs; - return MPXP_Ok; -} - - /* Init audio filters */ -MPXP_Rc mpca_init_filters(sh_audio_t *sh_audio, - unsigned in_samplerate, unsigned in_channels, mpaf_format_e in_format, - unsigned out_samplerate, unsigned out_channels, mpaf_format_e out_format, - unsigned out_minsize, unsigned out_maxsize){ - char strbuf[200]; - af_stream_t* afs=sh_audio->afilter; - if(!afs) afs = RND_RENAME6(af_new)(sh_audio); - - // input format: same as codec's output format: - afs->input.rate = in_samplerate; - afs->input.nch = in_channels; - afs->input.format = mpaf_format_decode(in_format); - - // output format: same as ao driver's input format (if missing, fallback to input) - afs->output.rate = out_samplerate ? out_samplerate : afs->input.rate; - afs->output.nch = out_channels ? out_channels : afs->input.nch; - afs->output.format = mpaf_format_decode(out_format ? out_format : afs->input.format); - - // filter config: - memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t)); - - MSG_V("Building audio filter chain for %dHz/%dch/%dbit (%s) -> %dHz/%dch/%dbit (%s)...\n", - afs->input.rate,afs->input.nch,(afs->input.format&MPAF_BPS_MASK)*8,ao_format_name(mpaf_format_encode(afs->input.format)), - afs->output.rate,afs->output.nch,(afs->output.format&MPAF_BPS_MASK)*8,ao_format_name(mpaf_format_encode(afs->output.format))); - - // let's autoprobe it! - if(MPXP_Ok != RND_RENAME7(af_init)(afs,1)){ - sh_audio->afilter=NULL; - mp_free(afs); - return MPXP_False; // failed :( - } - - // allocate the a_out_* buffers: - if(out_maxsize<out_minsize) out_maxsize=out_minsize; - if(out_maxsize<8192) out_maxsize=MAX_OUTBURST; // not sure this is ok - - sh_audio->af_bps = afs->output.rate*afs->output.nch*(afs->output.format&MPAF_BPS_MASK); - - MSG_V("AF_init: af format: %d ch, %d hz, %s af_bps=%i\n", - afs->output.nch, afs->output.rate, - mpaf_fmt2str(afs->output.format,strbuf,200), - sh_audio->af_bps); - - sh_audio->a_buffer_size=out_maxsize; - sh_audio->a_buffer=mp_mallocz(sh_audio->a_buffer_size); - sh_audio->a_buffer_len=0; - - af_showconf(afs->first); - sh_audio->afilter=(any_t*)afs; - sh_audio->afilter_inited=1; - return MPXP_Ok; -} - - /* Init audio filters */ -MPXP_Rc mpca_reinit_filters(sh_audio_t *sh_audio, - unsigned in_samplerate, unsigned in_channels, mpaf_format_e in_format, - unsigned out_samplerate, unsigned out_channels, mpaf_format_e out_format, - unsigned out_minsize, unsigned out_maxsize) -{ - if(sh_audio->afilter){ - MSG_V("Uninit audio filters...\n"); - af_uninit(sh_audio->afilter); - mp_free(sh_audio->afilter); - sh_audio->afilter=NULL; - } - return mpca_init_filters(sh_audio,in_samplerate,in_channels, - in_format,out_samplerate, - out_channels,out_format, - out_minsize,out_maxsize); -} - -unsigned RND_RENAME3(mpca_decode)(any_t *opaque,unsigned char *buf,unsigned minlen,unsigned maxlen,unsigned buflen,float *pts) -{ - priv_t* priv = (priv_t*)opaque; - sh_audio_t* sh_audio = priv->parent; - unsigned len; - unsigned cp_size,cp_tile; - mp_aframe_t afd; // filter input - mp_aframe_t* pafd; // filter output - - if(!sh_audio->inited) return 0; // no codec - MSG_DBG3("mpca_decode(%p,%p,%i,%i,%i,%p)\n",sh_audio,buf,minlen,maxlen,buflen,pts); - - if(minlen>maxlen) MSG_WARN(MSGTR_CODEC_XP_INT_ERR,minlen,maxlen); - if(sh_audio->af_buffer_len) { - cp_size=min(buflen,sh_audio->af_buffer_len); - memcpy(buf,sh_audio->af_buffer,cp_size); - *pts = sh_audio->af_pts; - cp_tile=sh_audio->af_buffer_len-cp_size; - MSG_DBG2("cache->buf %i bytes %f pts <PREDICTED PTS %f>\n",cp_size,*pts,*pts+(float)cp_tile/(float)sh_audio->af_bps); - if(cp_tile) { - sh_audio->af_buffer=&sh_audio->af_buffer[cp_size]; - sh_audio->af_buffer_len=cp_tile; - sh_audio->af_pts += (float)cp_size/(float)sh_audio->af_bps; - } - else sh_audio->af_buffer_len=0; - return cp_size; - } - if(sh_audio->af_bps>sh_audio->o_bps) - maxlen=min(maxlen,(long long int)buflen*sh_audio->o_bps/sh_audio->af_bps); - len=priv->mpadec->decode(sh_audio,buf, minlen, maxlen,pts); - if(len>buflen) MSG_WARN(MSGTR_CODEC_BUF_OVERFLOW,sh_audio->codec->driver_name,len,buflen); - MSG_DBG2("decaudio: %i bytes %f pts min %i max %i buflen %i o_bps=%i f_bps=%i\n",len,*pts,minlen,maxlen,buflen,sh_audio->o_bps,sh_audio->af_bps); - if(len==0 || !sh_audio->afilter) return 0; // EOF? - // run the filters: - memset(&afd,0,sizeof(mp_aframe_t)); - afd.audio=buf; - afd.len=len; - afd.rate=sh_audio->rate; - afd.nch=sh_audio->nch; - afd.format=mpaf_format_decode(sh_audio->afmt); - pafd=RND_RENAME8(af_play)(sh_audio->afilter,&afd); - - if(!pafd) { - MSG_V("decaudio: filter error\n"); - return 0; // error - } - - MSG_DBG2("decaudio: %X in=%d out=%d (min %d max %d buf %d)\n", - pafd->format,len, pafd->len, minlen, maxlen, buflen); - - cp_size=pafd->len; - if(buf != pafd->audio) { - cp_size=min(buflen,pafd->len); - memcpy(buf,pafd->audio,cp_size); - cp_tile=pafd->len-cp_size; - if(cp_tile) { - sh_audio->af_buffer=&((char *)pafd->audio)[cp_size]; - sh_audio->af_buffer_len=cp_tile; - sh_audio->af_pts = *pts+(float)cp_size/(float)sh_audio->af_bps; - MSG_DBG2("decaudio: afilter->cache %i bytes %f pts\n",cp_tile,*pts); - } else sh_audio->af_buffer_len=0; - } - return cp_size; -} - -/* Note: it is called once after seeking, to resync. */ -void mpca_resync_stream(any_t *opaque) -{ - priv_t* priv = (priv_t*)opaque; - sh_audio_t* sh_audio = priv->parent; - if(sh_audio) { - sh_audio->a_in_buffer_len=0; /* workaround */ - if(sh_audio->inited && priv->mpadec) priv->mpadec->control(sh_audio,ADCTRL_RESYNC_STREAM,NULL); - } -} - -/* Note: it is called to skip (jump over) small amount (1/10 sec or 1 frame) - of audio data - used to sync audio to video after seeking */ -void mpca_skip_frame(any_t *opaque) -{ - priv_t* priv = (priv_t*)opaque; - sh_audio_t* sh_audio = priv->parent; - MPXP_Rc rc=MPXP_True; - if(sh_audio) - if(sh_audio->inited && priv->mpadec) rc=priv->mpadec->control(sh_audio,ADCTRL_SKIP_FRAME,NULL); - if(rc!=MPXP_True) ds_fill_buffer(sh_audio->ds); -} Copied: mplayerxp/libmpcodecs/dec_audio.cpp (from rev 369, mplayerxp/libmpcodecs/dec_audio.c) =================================================================== --- mplayerxp/libmpcodecs/dec_audio.cpp (rev 0) +++ mplayerxp/libmpcodecs/dec_audio.cpp 2012-11-16 11:32:49 UTC (rev 384) @@ -0,0 +1,384 @@ +#include <algorithm> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "mp_config.h" +#include "help_mp.h" + +#include "mplayerxp.h" +#include "xmpcore/xmp_core.h" + +#include "libmpdemux/stream.h" +#include "libmpdemux/demuxer.h" +#include "libmpdemux/stheader.h" +#include "libmpconf/codec-cfg.h" + +#include "dec_audio.h" +#include "libao2/afmt.h" +#include "libao2/audio_out.h" +#include "mplayerxp.h" +#include "libmpdemux/demuxer_r.h" +#include "postproc/af.h" +#include "osdep/fastmemcpy.h" +#include "osdep/mplib.h" +#include "ad_msg.h" + +/* used for ac3surround decoder - set using -channels option */ +af_cfg_t af_cfg; // Configuration for audio filters + +typedef struct priv_s { + sh_audio_t* parent; + const ad_functions_t* mpadec; +}priv_t; + +any_t* RND_RENAME2(mpca_init)(sh_audio_t *sh_audio) +{ + const char *afm=NULL,*ac=NULL; + const audio_probe_t* aprobe=NULL; + priv_t* priv = new(zeromem) priv_t; + priv->parent=sh_audio; + if(!sh_audio->codec) { + if(mp_conf.audio_family) { + afm=mp_conf.audio_family; + ac=afm; + priv->mpadec=afm_find_driver(afm); + if(priv->mpadec) aprobe=priv->mpadec->probe(sh_audio,sh_audio->wtag); + } + else aprobe = afm_probe_driver(sh_audio); + } + if(aprobe) { + afm=aprobe->driver; + ac=aprobe->codec_dll; + /* fake struct codecs_st*/ + sh_audio->codec=new(zeromem) struct codecs_st; + strcpy(sh_audio->codec->dll_name,aprobe->codec_dll); + strcpy(sh_audio->codec->driver_name,aprobe->driver); + strcpy(sh_audio->codec->codec_name,sh_audio->codec->dll_name); + memcpy(sh_audio->codec->outfmt,aprobe->sample_fmt,sizeof(aprobe->sample_fmt)); + priv->mpadec=afm_find_driver(afm); + } + else if(sh_audio->codec) { + afm=sh_audio->codec->driver_name; + ac=sh_audio->codec->codec_name; + priv->mpadec=afm_find_driver(afm); + } + if(!priv->mpadec){ + MSG_ERR(MSGTR_CODEC_BAD_AFAMILY,ac, afm); + delete priv; + return NULL; // no such driver + } + + /* reset in/out buffer size/pointer: */ + sh_audio->a_buffer_size=0; + sh_audio->a_buffer=NULL; + sh_audio->a_in_buffer_size=0; + sh_audio->a_in_buffer=NULL; + + /* Set up some common usefull defaults. ad->preinit() can override these: */ +#ifdef WORDS_BIGENDIAN + sh_audio->afmt=AFMT_S16_BE; +#else + sh_audio->afmt=AFMT_S16_LE; +#endif + sh_audio->rate=0; + sh_audio->o_bps=0; + if(sh_audio->wf) /* NK: We need to know i_bps before its detection by codecs param */ + sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; + + sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ + sh_audio->audio_in_minsize=0; + + if(priv->mpadec->preinit(sh_audio)!=MPXP_Ok) { + MSG_ERR(MSGTR_CODEC_CANT_PREINITA); + delete priv; + return NULL; + } + + /* allocate audio in buffer: */ + if(sh_audio->audio_in_minsize>0){ + sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; + MSG_V("dec_audio: Allocating %d bytes for input buffer\n", + sh_audio->a_in_buffer_size); + sh_audio->a_in_buffer=new char [sh_audio->a_in_buffer_size]; + sh_audio->a_in_buffer_len=0; + } + + /* allocate audio out buffer: */ + sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/ + + MSG_V("dec_audio: Allocating %d + %d = %d bytes for output buffer\n", + sh_audio->audio_out_minsize,MAX_OUTBURST,sh_audio->a_buffer_size); + + sh_audio->a_buffer=new char [sh_audio->a_buffer_size]; + if(!sh_audio->a_buffer) { + MSG_ERR(MSGTR_CantAllocAudioBuf); + delete priv; + return NULL; + } + sh_audio->a_buffer_len=0; + + if(priv->mpadec->init(sh_audio)!=MPXP_Ok){ + MSG_WARN(MSGTR_CODEC_CANT_INITA); + mpca_uninit(priv); /* mp_free buffers */ + return NULL; + } + + sh_audio->inited=1; + + if(!sh_audio->nch || !sh_audio->rate) { + MSG_WARN(MSGTR_UnknownAudio); + mpca_uninit(priv); /* mp_free buffers */ + return NULL; + } + + if(!sh_audio->o_bps) + sh_audio->o_bps=sh_audio->nch*sh_audio->rate*afmt2bps(sh_audio->afmt); + if(!sh_audio->i_bps) { + static int warned=0; + if(!warned) { + warned=1; + MSG_WARN(MSGTR_CODEC_INITAL_AV_RESYNC); + } + } else if(xp_core->initial_apts_corr.need_correction==1) { + xp_core->initial_apts += ((float)(xp_core->initial_apts_corr.pts_bytes-xp_core->initial_apts_corr.nbytes))/(float)sh_audio->i_bps; + xp_core->initial_apts_corr.need_correction=0; + } + MSG_OK("[AC] %s decoder: [%s] drv:%s.%s ratio %i->%i\n",mp_conf.audio_codec?"Forcing":"Selecting" + ,ac + ,priv->mpadec->info->driver_name + ,ac + ,sh_audio->i_bps,sh_audio->o_bps); + if(sh_audio->codec) { delete sh_audio->codec; sh_audio->codec=NULL; } + return priv; +} + +void mpca_uninit(any_t *opaque) +{ + priv_t* priv = (priv_t*)opaque; + sh_audio_t* parent = priv->parent; + if(!parent) { delete priv; return; } + if(priv->parent->afilter){ + MSG_V("Uninit audio filters...\n"); + af_uninit(parent->afilter); + delete parent->afilter; + parent->afilter=NULL; + } + if(parent->a_buffer) delete parent->a_buffer; + parent->a_buffer=NULL; + if(parent->a_in_buffer) delete parent->a_in_buffer; + parent->a_in_buffer=NULL; + if(!parent->inited) { delete priv; return; } + MSG_V("uninit audio: ...\n"); + priv->mpadec->uninit(parent); + if(parent->a_buffer) delete parent->a_buffer; + parent->a_buffer=NULL; + parent->inited=0; + delete priv; +} + + /* Init audio filters */ +MPXP_Rc mpca_preinit_filters(sh_audio_t *sh_audio, + unsigned in_samplerate, unsigned in_channels, unsigned in_format, + unsigned* out_samplerate, unsigned* out_channels, unsigned* out_format){ + char strbuf[200]; + af_stream_t* afs=RND_RENAME6(af_new)(sh_audio); + + // input format: same as codec's output format: + afs->input.rate = in_samplerate; + afs->input.nch = in_channels; + afs->input.format = mpaf_format_decode(in_format); + + // output format: same as ao driver's input format (if missing, fallback to input) + afs->output.rate = *out_samplerate ? *out_samplerate : afs->input.rate; + afs->output.nch = *out_channels ? *out_channels : afs->input.nch; + if(*out_format) afs->output.format = mpaf_format_decode(*out_format); + else afs->output.format = afs->input.format; + + // filter config: + memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t)); + + MSG_V("Checking audio filter chain for %dHz/%dch/%dbit...\n", + afs->input.rate,afs->input.nch,(afs->input.format&MPAF_BPS_MASK)*8); + + // let's autoprobe it! + if(MPXP_Ok != RND_RENAME7(af_init)(afs,0)){ + delete afs; + return MPXP_False; // failed :( + } + + *out_samplerate=afs->output.rate; + *out_channels=afs->output.nch; + *out_format=mpaf_format_encode(afs->output.format); + + sh_audio->af_bps = afs->output.rate*afs->output.nch*(afs->output.format&MPAF_BPS_MASK); + + MSG_V("AF_pre: af format: %d ch, %d hz, %s af_bps=%i\n", + afs->output.nch, afs->output.rate, + mpaf_fmt2str(afs->output.format,strbuf,200), + sh_audio->af_bps); + + sh_audio->afilter=afs; + return MPXP_Ok; +} + + /* Init audio filters */ +MPXP_Rc mpca_init_filters(sh_audio_t *sh_audio, + unsigned in_samplerate, unsigned in_channels, mpaf_format_e in_format, + unsigned out_samplerate, unsigned out_channels, mpaf_format_e out_format, + unsigned out_minsize, unsigned out_maxsize){ + char strbuf[200]; + af_stream_t* afs=sh_audio->afilter; + if(!afs) afs = RND_RENAME6(af_new)(sh_audio); + + // input format: same as codec's output format: + afs->input.rate = in_samplerate; + afs->input.nch = in_channels; + afs->input.format = mpaf_format_decode(in_format); + + // output format: same as ao driver's input format (if missing, fallback to input) + afs->output.rate = out_samplerate ? out_samplerate : afs->input.rate; + afs->output.nch = out_channels ? out_channels : afs->input.nch; + afs->output.format = mpaf_format_decode(out_format ? out_format : afs->input.format); + + // filter config: + memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t)); + + MSG_V("Building audio filter chain for %dHz/%dch/%dbit (%s) -> %dHz/%dch/%dbit (%s)...\n", + afs->input.rate,afs->input.nch,(afs->input.format&MPAF_BPS_MASK)*8,ao_format_name(mpaf_format_encode(afs->input.format)), + afs->output.rate,afs->output.nch,(afs->output.format&MPAF_BPS_MASK)*8,ao_format_name(mpaf_format_encode(afs->output.format))); + + // let's autoprobe it! + if(MPXP_Ok != RND_RENAME7(af_init)(afs,1)){ + sh_audio->afilter=NULL; + delete afs; + return MPXP_False; // failed :( + } + + // allocate the a_out_* buffers: + if(out_maxsize<out_minsize) out_maxsize=out_minsize; + if(out_maxsize<8192) out_maxsize=MAX_OUTBURST; // not sure this is ok + + sh_audio->af_bps = afs->output.rate*afs->output.nch*(afs->output.format&MPAF_BPS_MASK); + + MSG_V("AF_init: af format: %d ch, %d hz, %s af_bps=%i\n", + afs->output.nch, afs->output.rate, + mpaf_fmt2str(afs->output.format,strbuf,200), + sh_audio->af_bps); + + sh_audio->a_buffer_size=out_maxsize; + sh_audio->a_buffer=new char [sh_audio->a_buffer_size]; + sh_audio->a_buffer_len=0; + + af_showconf(afs->first); + sh_audio->afilter=afs; + sh_audio->afilter_inited=1; + return MPXP_Ok; +} + + /* Init audio filters */ +MPXP_Rc mpca_reinit_filters(sh_audio_t *sh_audio, + unsigned in_samplerate, unsigned in_channels, mpaf_format_e in_format, + unsigned out_samplerate, unsigned out_channels, mpaf_format_e out_format, + unsigned out_minsize, unsigned out_maxsize) +{ + if(sh_audio->afilter){ + MSG_V("Uninit audio filters...\n"); + af_uninit(sh_audio->afilter); + delete sh_audio->afilter; + sh_audio->afilter=NULL; + } + return mpca_init_filters(sh_audio,in_samplerate,in_channels, + in_format,out_samplerate, + out_channels,out_format, + out_minsize,out_maxsize); +} + +unsigned RND_RENAME3(mpca_decode)(any_t *opaque,unsigned char *buf,unsigned minlen,unsigned maxlen,unsigned buflen,float *pts) +{ + priv_t* priv = (priv_t*)opaque; + sh_audio_t* sh_audio = priv->parent; + unsigned len; + unsigned cp_size,cp_tile; + mp_aframe_t afd; // filter input + mp_aframe_t* pafd; // filter output + + if(!sh_audio->inited) return 0; // no codec + MSG_DBG3("mpca_decode(%p,%p,%i,%i,%i,%p)\n",sh_audio,buf,minlen,maxlen,buflen,pts); + + if(minlen>maxlen) MSG_WARN(MSGTR_CODEC_XP_INT_ERR,minlen,maxlen); + if(sh_audio->af_buffer_len) { + cp_size=std::min(buflen,sh_audio->af_buffer_len); + memcpy(buf,sh_audio->af_buffer,cp_size); + *pts = sh_audio->af_pts; + cp_tile=sh_audio->af_buffer_len-cp_size; + MSG_DBG2("cache->buf %i bytes %f pts <PREDICTED PTS %f>\n",cp_size,*pts,*pts+(float)cp_tile/(float)sh_audio->af_bps); + if(cp_tile) { + sh_audio->af_buffer=&sh_audio->af_buffer[cp_size]; + sh_audio->af_buffer_len=cp_tile; + sh_audio->af_pts += (float)cp_size/(float)sh_audio->af_bps; + } + else sh_audio->af_buffer_len=0; + return cp_size; + } + if(sh_audio->af_bps>sh_audio->o_bps) + maxlen=std::min(maxlen,buflen*sh_audio->o_bps/sh_audio->af_bps); + len=priv->mpadec->decode(sh_audio,buf, minlen, maxlen,pts); + if(len>buflen) MSG_WARN(MSGTR_CODEC_BUF_OVERFLOW,sh_audio->codec->driver_name,len,buflen); + MSG_DBG2("decaudio: %i bytes %f pts min %i max %i buflen %i o_bps=%i f_bps=%i\n",len,*pts,minlen,maxlen,buflen,sh_audio->o_bps,sh_audio->af_bps); + if(len==0 || !sh_audio->afilter) return 0; // EOF? + // run the filt... [truncated message content] |