[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