[prev in list] [next in list] [prev in thread] [next in thread] 

List:       nas
Subject:    New! Improved! clipping patch
From:       nowhere!sking () geraldo ! cc ! utexas ! edu (Steven King)
Date:       1994-07-24 18:04:06
[Download RAW message or body]


  This should produce audible improvements when multiple flow are combined
 or MultiplyConstant's are used to boost the volume past 100% without
 significantly affecting performance.

*** server/dia/auprocess.c.orig	Wed Jun  1 13:30:07 1994
--- server/dia/auprocess.c	Sat Jul  2 04:58:37 1994
***************
*** 27,32 ****
--- 27,33 ----
  #include <audio/audio.h>
  #include <audio/Aproto.h>
  #include "au.h"
+ #include "os.h"			/* for ALLOCATE_LOCAL && DEALLOCATE_LOCAL */
  
  AuInt32         auMinibufSamples;
  AuUint32        auPhysicalOutputBuffersSize;
***************
*** 855,875 ****
  }
  
  static void
! accumulateOutput(input, output)
  CompiledFlowInputPtr input;
  CompiledFlowOutputPtr output;
  {
!     AuInt16        *in,
!                    *out;
      AuUint32        i,
                      j;
!     AuInt32         multiplyConstant,
!                     addConstant;
  
      in = (AuInt16 *) input->flowEl->minibuf;
!     out = (AuInt16 *) output->flowEl->minibuf;
!     multiplyConstant = input->multiplyConstant;
!     addConstant = input->addConstant;
  
      /*
       * input->numTracks == 0 means all input tracks map directly to the
--- 856,879 ----
  }
  
  static void
! accumulateOutput(input, output, accumulator)
  CompiledFlowInputPtr input;
  CompiledFlowOutputPtr output;
+ AuInt32 *accumulator;
  {
!     AuInt16        *in;
      AuUint32        i,
                      j;
!     AuInt32         multiplyConstantInteger,
!                     multiplyConstantFraction,
!                     addConstantInteger,
!                     addConstantFraction;
  
      in = (AuInt16 *) input->flowEl->minibuf;
!     multiplyConstantInteger = AuFixedPointIntegralAddend(input->multiplyConstant);
!     multiplyConstantFraction = AuFixedPointFractionalAddend(input->multiplyConstant);
!     addConstantInteger = AuFixedPointIntegralAddend(input->addConstant);
!     addConstantFraction = AuFixedPointFractionalAddend(input->addConstant);
  
      /*
       * input->numTracks == 0 means all input tracks map directly to the
***************
*** 877,909 ****
       */
      if (input->numTracks)
  	for (i = 0; i < input->flowEl->minibufSamples; i++,
! 	     out += output->component->numTracks,
  	     in += input->component->numTracks)
  	    for (j = 0; j < input->numTracks; j++)
! 		out[input->outTrack[j]] += (in[input->inTrack[j]] *
! 				      multiplyConstant + addConstant) >> 16;
      else
  	for (i = 0; i < input->flowEl->minibufSamples; i++)
! 	    for (j = 0; j < output->component->numTracks; j++)
! 		*out++ += (*in++ * multiplyConstant + addConstant) >> 16;
  }
  
  static void
! accumulateOutputSimple(input, output)
  CompiledFlowInputPtr input;
  CompiledFlowOutputPtr output;
  {
!     AuInt16        *in,
!                    *out;
      AuUint32        i;
!     AuInt32         multiplyConstant;
  
      in = (AuInt16 *) input->flowEl->minibuf;
!     out = (AuInt16 *) output->flowEl->minibuf;
!     multiplyConstant = input->multiplyConstant;
  
!     for (i = 0; i < input->flowEl->minibufSamples; i++)
! 	*out++ += (*in++ * multiplyConstant) >> 16;
  }
  
  /* process an audio flow */
--- 881,920 ----
       */
      if (input->numTracks)
  	for (i = 0; i < input->flowEl->minibufSamples; i++,
! 	     accumulator += output->component->numTracks,
  	     in += input->component->numTracks)
  	    for (j = 0; j < input->numTracks; j++)
! 		accumulator[input->outTrack[j]] +=
! 			(in[input->inTrack[j]] * multiplyConstantInteger) +
! 			((in[input->inTrack[j]] * multiplyConstantFraction) >> 16) +
! 			((((AuInt16)(in[input->inTrack[j]] * multiplyConstantFraction)) + addConstantFraction) >> 16) +
! 			addConstantInteger;
      else
  	for (i = 0; i < input->flowEl->minibufSamples; i++)
! 	    for (j = 0; j < output->component->numTracks; j++, in++)
! 		*accumulator++ += (*in * multiplyConstantInteger) +
! 			((*in * multiplyConstantFraction) >> 16) +
! 			((((AuInt16)(*in * multiplyConstantFraction)) + addConstantFraction) >> 16) +
! 			addConstantInteger;
  }
  
  static void
! accumulateOutputSimple(input, output, accumulator)
  CompiledFlowInputPtr input;
  CompiledFlowOutputPtr output;
+ AuInt32 *accumulator;
  {
!     AuInt16        *in;
      AuUint32        i;
!     AuInt32         multiplyConstantInteger,
!                     multiplyConstantFraction;
  
      in = (AuInt16 *) input->flowEl->minibuf;
!     multiplyConstantInteger = AuFixedPointIntegralAddend(input->multiplyConstant);
!     multiplyConstantFraction = AuFixedPointFractionalAddend(input->multiplyConstant);
  
!     for (i = 0; i < input->flowEl->minibufSamples; i++, in++)
! 	*accumulator++ += (*in * multiplyConstantInteger) + ((*in * multiplyConstantFraction) >> 16);
  }
  
  /* process an audio flow */
***************
*** 932,946 ****
  	AuUint32        outputState;
  	ComponentPtr    oc;
  	FlowElementPtr  oel;
  
  	output = &fl->outputs[i];
  	oc = output->component;
  	oel = output->flowEl;
  	outputState = oel->state;
  
! 	/* clear the output minibuffer */
! 	if (oc->kind != AuComponentKindPhysicalOutput)
! 	    bzero(oel->minibuf, oc->minibufSize);
  
  	oel->minibufSamples = 0;
  
--- 943,960 ----
  	AuUint32        outputState;
  	ComponentPtr    oc;
  	FlowElementPtr  oel;
+ 	AuInt32		*accumulator;
+ 	AuUint32	n;
  
  	output = &fl->outputs[i];
  	oc = output->component;
  	oel = output->flowEl;
  	outputState = oel->state;
+ 	n = (oc->minibufSize / oc->bytesPerSample) * oc->numTracks;
+ 	accumulator = (AuInt32 *)ALLOCATE_LOCAL(n * sizeof(AuInt32));
  
! 	/* clear the output accumulator */
! 	auclr(accumulator, n * sizeof(AuInt32));
  
  	oel->minibufSamples = 0;
  
***************
*** 955,961 ****
  
  		if (outputState == AuStateStart)
  		{
! 		    (*fl->accumulateOutput) (input, output);
  		    oel->minibufSamples = aumax(oel->minibufSamples,
  					     input->flowEl->minibufSamples);
  		}
--- 969,975 ----
  
  		if (outputState == AuStateStart)
  		{
! 		    (*fl->accumulateOutput) (input, output, accumulator);
  		    oel->minibufSamples = aumax(oel->minibufSamples,
  					     input->flowEl->minibufSamples);
  		}
***************
*** 964,972 ****
--- 978,992 ----
  
  	if (outputState == AuStateStart)
  	{
+ 	    /* clip values from accumulator into output  */
+ 	    AuInt16 *b = (AuInt16 *) oel->minibuf;
+ 	    n = oel->minibufSamples * oc->numTracks;
+ 	    for (j = 0; j < n; ++j)
+ 		*b++ = accumulator[j] < -32768 ? -32768 : accumulator[j] > 32767 ? 32767 : accumulator[j];
  	    oel->minibufBytes = oel->minibufSamples * oc->bytesPerSample;
  	    flowStateChanged |= writeOutput(output);
  	}
+ 	DEALLOCATE_LOCAL(accumulator);
      }
  
      if (clocked)

-------------------------------------------------------------------------------
take your pick                         sking@nowhere
                                       nowhere!sking@geraldo.cc.utexas.edu
                                       ...!cs.utexas.edu!geraldo!nowhere!sking

"As in most close races in Texas, Johnson had not defrauded Stevenson, but
 successsfully outfrauded him."
                                                             --T. R. Fehrenbach

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic