[MPlayer-dev-eng] [patch] passthrough mode for audio plugins, bugfix for pl_resample

Christian Ohm chr.ohm at gmx.net
Mon Apr 29 00:01:38 CEST 2002


hi.

the attached patch adds a passthrough mode to all audio plugins. i've tested
only pl_resample and pl_volnorm, but all others should work, too. the
pl_resample patch also fixes a bug where the volume would be decreased if
fin == fout. (at least i can't see a reason for the right-shift of the data
when fin == fout.)

bye
christian ohm

-- 
Walking on water wasn't built in a day.
		-- Jack Kerouac
-------------- next part --------------
? fibmap_mplayer
Index: libao2/pl_extrastereo.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_extrastereo.c,v
retrieving revision 1.1
diff -u -r1.1 pl_extrastereo.c
--- libao2/pl_extrastereo.c	3 Mar 2002 14:17:53 -0000	1.1
+++ libao2/pl_extrastereo.c	28 Apr 2002 21:57:26 -0000
@@ -32,14 +32,16 @@
 
 // local data
 static struct {
+  int      passthrough; // do nothing
   float    mul;         // intensity
   int      inuse;     	// This plugin is in use TRUE, FALSE
   int      format;	// sample format
-} pl_extrastereo = {2.5, 0, 0};
+} pl_extrastereo = {0, 2.5, 0, 0};
 
 
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
+  if(pl_extrastereo.passthrough) return CONTROL_OK;
   switch(cmd){
   case AOCONTROL_PLUGIN_SET_LEN:
     return CONTROL_OK;
@@ -50,17 +52,19 @@
 // open & setup audio device
 // return: 1=success 0=fail
 static int init(){
+  pl_extrastereo.inuse=1;
+
   switch(ao_plugin_data.format){
   case(AFMT_S16_LE):
     break;
   default:
-    fprintf(stderr,"[pl_extrastereo] Audio format not yet suported \n");
-    return 0;
+    fprintf(stderr,"[pl_extrastereo] Input audio format not yet supported, using passthrough mode.\n");
+    pl_extrastereo.passthrough=1;
+    return 1;
   }
 
   pl_extrastereo.mul=ao_plugin_cfg.pl_extrastereo_mul;
   pl_extrastereo.format=ao_plugin_data.format;
-  pl_extrastereo.inuse=1;
 
   printf("[pl_extrastereo] Extra stereo plugin in use (multiplier=%2.2f).\n",
            pl_extrastereo.mul);
@@ -79,7 +83,7 @@
 // processes 'ao_plugin_data.len' bytes of 'data'
 // called for every block of data
 static int play(){
-
+  if(pl_extrastereo.passthrough) return 1;
   switch(pl_extrastereo.format){
   case(AFMT_S16_LE): {
 
@@ -114,7 +118,7 @@
     break;
   }
   default:
-    return 0;
+    return 0; // shouldn't happen
   }
   return 1;
 }
Index: libao2/pl_format.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_format.c,v
retrieving revision 1.4
diff -u -r1.4 pl_format.c
--- libao2/pl_format.c	4 Dec 2001 12:28:26 -0000	1.4
+++ libao2/pl_format.c	28 Apr 2002 21:57:31 -0000
@@ -30,6 +30,7 @@
 // local data
 typedef struct pl_format_s
 {
+  int    passthrough;// do nothing
   void*  data;       // local audio data block
   int    len;        // local buffer length
   int 	 in;  	     // input fomat
@@ -37,7 +38,7 @@
   double sz_mult;    // data size multiplier
 } pl_format_t;
 
-static pl_format_t pl_format={NULL,0,0,0,1};
+static pl_format_t pl_format={0,NULL,0,0,0,1};
 
 // Number of bits
 #define B08		(0<<0) 
@@ -57,6 +58,7 @@
 
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
+  if (pl_format.passthrough) return CONTROL_OK;
   switch(cmd){
   case AOCONTROL_PLUGIN_SET_LEN:
     if(pl_format.data) 
@@ -97,8 +99,9 @@
   case(AFMT_A_LAW):
   case(AFMT_MPEG):
   case(AFMT_AC3):
-    printf("[pl_format] Input audio format not yet suported \n");
-    return 0;
+    printf("[pl_format] Input audio format not yet supported, using passthrough mode.\n");
+    pl_format.passthrough=1;
+    return 1;
   default: 
     printf("[pl_format] Unrecognised input audio format\n"); //This can not happen .... 
     return 0;
@@ -161,6 +164,7 @@
 
 // empty buffers
 static void reset(){
+  if (pl_format.passthrough) return;
   memset(pl_format.data, 0, pl_format.len);
 }
 
@@ -174,6 +178,7 @@
   int len=(ao_plugin_data.len)>>(pl_format.in&NBITS_MASK);
   ao_plugin_data.len=(int)(((double)ao_plugin_data.len)*=pl_format.sz_mult);
   
+  if(pl_format.passthrough) return 1;;
   // Change to little endian (Is this true for sun ?)
   if((pl_format.in&END_MASK)!=LE){
     switch(pl_format.in&NBITS_MASK){
Index: libao2/pl_resample.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_resample.c,v
retrieving revision 1.7
diff -u -r1.7 pl_resample.c
--- libao2/pl_resample.c	21 Feb 2002 16:05:09 -0000	1.7
+++ libao2/pl_resample.c	28 Apr 2002 21:57:32 -0000
@@ -81,6 +81,7 @@
 // local data
 typedef struct pl_resample_s
 {
+  int		passthrough;    // do nothing
   int16_t*	data;		// Data buffer
   int16_t*  	w;		// Current filter weights
   uint16_t  	dn;     	// Down sampling factor
@@ -91,10 +92,11 @@
   int16_t 	xs[CH][L*2]; 	// Circular buffers
 } pl_resample_t;
 
-static pl_resample_t 	pl_resample	= {NULL,NULL,1,1,1,0,W};
+static pl_resample_t 	pl_resample	= {0,NULL,NULL,1,1,1,0,W};
 
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
+  if (pl_resample.passthrough) return CONTROL_OK;
   switch(cmd){
   case AOCONTROL_PLUGIN_SET_LEN:
     if(pl_resample.data) 
@@ -121,8 +123,9 @@
 
   // Sheck input format
   if(ao_plugin_data.format != AFMT_S16_LE){
-    fprintf(stderr,"[pl_resample] Input audio format not yet suported. \n");
-    return 0;
+    fprintf(stderr,"[pl_resample] Input audio format not yet supported, using passthrough mode.\n");
+    pl_resample.passthrough=1;
+    return 1;
   }
   // Sanity check and calculate down sampling factor
   if((float)max(fin,fout)/(float)min(fin,fout) > 10){
@@ -130,6 +133,11 @@
     return 0;
   }
   pl_resample.dn=(int)(0.5+((float)(fin*pl_resample.up))/((float)fout));
+  if(pl_resample.dn==pl_resample.up){
+    fprintf(stderr,"[pl_resample] fin == fout, using passthrough mode.\n");
+    pl_resample.passthrough=1;
+    return 1;
+  }
 
   pl_resample.channels=ao_plugin_data.channels;
   if(ao_plugin_data.channels>CH){
@@ -164,12 +172,8 @@
 // called for every block of data
 // FIXME: this routine needs to be optimized (it is probably possible to do a lot here)
 static int play(){
-  if(pl_resample.up==pl_resample.dn){
-    register int16_t*	in    = ((int16_t*)ao_plugin_data.data);
-    register int16_t* 	end   = in+ao_plugin_data.len/2;
-    while(in < end) *in=(*in++)>>1;
+  if(pl_resample.passthrough)
     return 1;
-  }
   if(pl_resample.up>pl_resample.dn)
     return upsample();
   if(pl_resample.up<pl_resample.dn)
Index: libao2/pl_volnorm.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_volnorm.c,v
retrieving revision 1.4
diff -u -r1.4 pl_volnorm.c
--- libao2/pl_volnorm.c	10 Mar 2002 13:53:38 -0000	1.4
+++ libao2/pl_volnorm.c	28 Apr 2002 21:57:33 -0000
@@ -97,13 +97,15 @@
 
 // Local data
 static struct {
+  int      passthrough; // do nothing
   int      inuse;     	// This plugin is in use TRUE, FALSE
   int      format;	// sample fomat
-} pl_volnorm = {0, 0};
+} pl_volnorm = {0, 0, 0};
 
 
 // minimal interface
 static int control(int cmd,int arg){
+  if(pl_volnorm.passthrough) return CONTROL_OK;
   switch(cmd){
   case AOCONTROL_PLUGIN_SET_LEN:
     return CONTROL_OK;
@@ -115,16 +117,18 @@
 // open & setup audio device
 // return: 1=success 0=fail
 static int init(){
+  pl_volnorm.inuse = 1;
+
   switch(ao_plugin_data.format){
     case(AFMT_S16_LE):
       break;
     default:
-      fprintf(stderr,"[pl_volnorm] Audio format not yet supported.\n");
-      return 0;
+      fprintf(stderr,"[pl_volnorm] Input audio format not yet supported, using passthrough mode.\n");
+      pl_volnorm.passthrough=1;
+      return 1;
   }
 
   pl_volnorm.format = ao_plugin_data.format;
-  pl_volnorm.inuse = 1;
 
   reset();
 
@@ -140,6 +144,7 @@
 // empty buffers
 static void reset(){
   int i;
+  if(pl_volnorm.passthrough) return;
   mul = MUL_INIT;
   switch(ao_plugin_data.format) {
     case(AFMT_S16_LE):
@@ -154,7 +159,7 @@
 #endif
 
       break;
-    default:
+    default: // shouldn't happen
       fprintf(stderr,"[pl_volnorm] internal inconsistency - bugreport !\n");
       *(char *) 0 = 0;
   }
@@ -163,7 +168,7 @@
 // processes 'ao_plugin_data.len' bytes of 'data'
 // called for every block of data
 static int play(){
-
+  if(pl_volnorm.passthrough) return 1;
   switch(pl_volnorm.format){
   case(AFMT_S16_LE): {
 
@@ -242,7 +247,7 @@
 
     break;
   }
-  default:
+  default: // shouldn't happen
     return 0;
   }
   return 1;
Index: libao2/pl_volume.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_volume.c,v
retrieving revision 1.2
diff -u -r1.2 pl_volume.c
--- libao2/pl_volume.c	13 Mar 2002 12:32:42 -0000	1.2
+++ libao2/pl_volume.c	28 Apr 2002 21:57:33 -0000
@@ -35,15 +35,17 @@
 // local data
 typedef struct pl_volume_s
 {
+  int      passthrough; // do nothing
   uint16_t volume;   	// output volume level
   int      inuse;     	// This plugin is in use TRUE, FALSE
   int      format;	// sample fomat
 } pl_volume_t;
 
-static pl_volume_t pl_volume={0,0,0};
+static pl_volume_t pl_volume={0,0,0,0};
 
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
+  if(pl_volume.passthrough) return CONTROL_OK;
   switch(cmd){
   case AOCONTROL_PLUGIN_SET_LEN:
     return CONTROL_OK;
@@ -78,22 +80,23 @@
 // open & setup audio device
 // return: 1=success 0=fail
 static int init(){
+  /* The inuse flag is used in control to detremine if the return
+  value since that function always is called from ao_plugin regardless
+  of wether this plugin is in use or not. */
+  pl_volume.inuse=1;
   // Sanity sheck this plugin supports AFMT_U8 and AFMT_S16_LE
   switch(ao_plugin_data.format){
   case(AFMT_U8):
   case(AFMT_S16_LE):
     break;
   default: 
-    fprintf(stderr,"[pl_volume] Audio format not yet suported \n");
-    return 0;
+    fprintf(stderr,"[pl_volume] Input audio format not yet supported, using passthrough mode.\n");
+    pl_volume.passthrough=1;
+    return 1;
   }
   // Initialize volume to this value
   pl_volume.volume=ao_plugin_cfg.pl_volume_volume;
   pl_volume.format=ao_plugin_data.format;
-  /* The inuse flag is used in control to detremine if the return
-  value since that function always is called from ao_plugin regardless
-  of wether this plugin is in use or not. */
-  pl_volume.inuse=1;
   // Tell the world what we are up to
   printf("[pl_volume] Software volume control in use%s.\n",ao_plugin_cfg.pl_volume_softclip?", soft clipping enabled":"");
   return 1;
@@ -114,6 +117,7 @@
 static int play(){
   register int i=0;
   register int vol=pl_volume.volume; // Logarithmic control sounds more natural
+  if(pl_volume.passthrough) return 1;
   vol=(vol*vol*vol)>>12;
   // Change the volume.
   switch(pl_volume.format){
@@ -158,7 +162,7 @@
     }
     break;
   }
-  default: 
+  default: // shouldn't happen
     return 0;
   }
   return 1;


More information about the MPlayer-dev-eng mailing list