\section{Built-in Module \sectcode{audioop}}
\label{module-audioop}
\bimodindex{audioop}

The \code{audioop} module contains some useful operations on sound fragments.
It operates on sound fragments consisting of signed integer samples
8, 16 or 32 bits wide, stored in Python strings.  This is the same
format as used by the \code{al} and \code{sunaudiodev} modules.  All
scalar items are integers, unless specified otherwise.

A few of the more complicated operations only take 16-bit samples,
otherwise the sample size (in bytes) is always a parameter of the operation.

The module defines the following variables and functions:

\renewcommand{\indexsubitem}{(in module audioop)}
\begin{excdesc}{error}
This exception is raised on all errors, such as unknown number of bytes
per sample, etc.
\end{excdesc}

\begin{funcdesc}{add}{fragment1\, fragment2\, width}
Return a fragment which is the addition of the two samples passed as
parameters.  \var{width} is the sample width in bytes, either
\code{1}, \code{2} or \code{4}.  Both fragments should have the same
length.
\end{funcdesc}

\begin{funcdesc}{adpcm2lin}{adpcmfragment\, width\, state}
Decode an Intel/DVI ADPCM coded fragment to a linear fragment.  See
the description of \code{lin2adpcm} for details on ADPCM coding.
Return a tuple \code{(\var{sample}, \var{newstate})} where the sample
has the width specified in \var{width}.
\end{funcdesc}

\begin{funcdesc}{adpcm32lin}{adpcmfragment\, width\, state}
Decode an alternative 3-bit ADPCM code.  See \code{lin2adpcm3} for
details.
\end{funcdesc}

\begin{funcdesc}{avg}{fragment\, width}
Return the average over all samples in the fragment.
\end{funcdesc}

\begin{funcdesc}{avgpp}{fragment\, width}
Return the average peak-peak value over all samples in the fragment.
No filtering is done, so the usefulness of this routine is
questionable.
\end{funcdesc}

\begin{funcdesc}{bias}{fragment\, width\, bias}
Return a fragment that is the original fragment with a bias added to
each sample.
\end{funcdesc}

\begin{funcdesc}{cross}{fragment\, width}
Return the number of zero crossings in the fragment passed as an
argument.
\end{funcdesc}

\begin{funcdesc}{findfactor}{fragment\, reference}
Return a factor \var{F} such that
\code{rms(add(fragment, mul(reference, -F)))} is minimal, i.e.,
return the factor with which you should multiply \var{reference} to
make it match as well as possible to \var{fragment}.  The fragments
should both contain 2-byte samples.

The time taken by this routine is proportional to \code{len(fragment)}. 
\end{funcdesc}

\begin{funcdesc}{findfit}{fragment\, reference}
This routine (which only accepts 2-byte sample fragments)

Try to match \var{reference} as well as possible to a portion of
\var{fragment} (which should be the longer fragment).  This is
(conceptually) done by taking slices out of \var{fragment}, using
\code{findfactor} to compute the best match, and minimizing the
result.  The fragments should both contain 2-byte samples.  Return a
tuple \code{(\var{offset}, \var{factor})} where \var{offset} is the
(integer) offset into \var{fragment} where the optimal match started
and \var{factor} is the (floating-point) factor as per
\code{findfactor}.
\end{funcdesc}

\begin{funcdesc}{findmax}{fragment\, length}
Search \var{fragment} for a slice of length \var{length} samples (not
bytes!)\ with maximum energy, i.e., return \var{i} for which
\code{rms(fragment[i*2:(i+length)*2])} is maximal.  The fragments
should both contain 2-byte samples.

The routine takes time proportional to \code{len(fragment)}.
\end{funcdesc}

\begin{funcdesc}{getsample}{fragment\, width\, index}
Return the value of sample \var{index} from the fragment.
\end{funcdesc}

\begin{funcdesc}{lin2lin}{fragment\, width\, newwidth}
Convert samples between 1-, 2- and 4-byte formats.
\end{funcdesc}

\begin{funcdesc}{lin2adpcm}{fragment\, width\, state}
Convert samples to 4 bit Intel/DVI ADPCM encoding.  ADPCM coding is an
adaptive coding scheme, whereby each 4 bit number is the difference
between one sample and the next, divided by a (varying) step.  The
Intel/DVI ADPCM algorithm has been selected for use by the IMA, so it
may well become a standard.

\code{State} is a tuple containing the state of the coder.  The coder
returns a tuple \code{(\var{adpcmfrag}, \var{newstate})}, and the
\var{newstate} should be passed to the next call of lin2adpcm.  In the
initial call \code{None} can be passed as the state.  \var{adpcmfrag}
is the ADPCM coded fragment packed 2 4-bit values per byte.
\end{funcdesc}

\begin{funcdesc}{lin2adpcm3}{fragment\, width\, state}
This is an alternative ADPCM coder that uses only 3 bits per sample.
It is not compatible with the Intel/DVI ADPCM coder and its output is
not packed (due to laziness on the side of the author).  Its use is
discouraged.
\end{funcdesc}

\begin{funcdesc}{lin2ulaw}{fragment\, width}
Convert samples in the audio fragment to U-LAW encoding and return
this as a Python string.  U-LAW is an audio encoding format whereby
you get a dynamic range of about 14 bits using only 8 bit samples.  It
is used by the Sun audio hardware, among others.
\end{funcdesc}

\begin{funcdesc}{minmax}{fragment\, width}
Return a tuple consisting of the minimum and maximum values of all
samples in the sound fragment.
\end{funcdesc}

\begin{funcdesc}{max}{fragment\, width}
Return the maximum of the \emph{absolute value} of all samples in a
fragment.
\end{funcdesc}

\begin{funcdesc}{maxpp}{fragment\, width}
Return the maximum peak-peak value in the sound fragment.
\end{funcdesc}

\begin{funcdesc}{mul}{fragment\, width\, factor}
Return a fragment that has all samples in the original framgent
multiplied by the floating-point value \var{factor}.  Overflow is
silently ignored.
\end{funcdesc}

\begin{funcdesc}{ratecv}{fragment\, width\, nchannels\, inrate\, outrate\, state\optional{\, weightA\, weightB}}
Convert the frame rate of the input fragment.

\code{State} is a tuple containing the state of the converter.  The
converter returns a tupl \code{(\var{newfragment}, \var{newstate})},
and \var{newstate} should be passed to the next call of ratecv.

The \code{weightA} and \code{weightB} arguments are parameters for a
simple digital filter and default to 1 and 0 respectively.
\end{funcdesc}

\begin{funcdesc}{reverse}{fragment\, width}
Reverse the samples in a fragment and returns the modified fragment.
\end{funcdesc}

\begin{funcdesc}{rms}{fragment\, width}
Return the root-mean-square of the fragment, i.e.
\iftexi
the square root of the quotient of the sum of all squared sample value,
divided by the sumber of samples.
\else
% in eqn: sqrt { sum S sub i sup 2  over n }
\begin{displaymath}
\catcode`_=8
\sqrt{\frac{\sum{{S_{i}}^{2}}}{n}}
\end{displaymath}
\fi
This is a measure of the power in an audio signal.
\end{funcdesc}

\begin{funcdesc}{tomono}{fragment\, width\, lfactor\, rfactor} 
Convert a stereo fragment to a mono fragment.  The left channel is
multiplied by \var{lfactor} and the right channel by \var{rfactor}
before adding the two channels to give a mono signal.
\end{funcdesc}

\begin{funcdesc}{tostereo}{fragment\, width\, lfactor\, rfactor}
Generate a stereo fragment from a mono fragment.  Each pair of samples
in the stereo fragment are computed from the mono sample, whereby left
channel samples are multiplied by \var{lfactor} and right channel
samples by \var{rfactor}.
\end{funcdesc}

\begin{funcdesc}{ulaw2lin}{fragment\, width}
Convert sound fragments in ULAW encoding to linearly encoded sound
fragments.  ULAW encoding always uses 8 bits samples, so \var{width}
refers only to the sample width of the output fragment here.
\end{funcdesc}

Note that operations such as \code{mul} or \code{max} make no
distinction between mono and stereo fragments, i.e.\ all samples are
treated equal.  If this is a problem the stereo fragment should be split
into two mono fragments first and recombined later.  Here is an example
of how to do that:
\bcode\begin{verbatim}
def mul_stereo(sample, width, lfactor, rfactor):
    lsample = audioop.tomono(sample, width, 1, 0)
    rsample = audioop.tomono(sample, width, 0, 1)
    lsample = audioop.mul(sample, width, lfactor)
    rsample = audioop.mul(sample, width, rfactor)
    lsample = audioop.tostereo(lsample, width, 1, 0)
    rsample = audioop.tostereo(rsample, width, 0, 1)
    return audioop.add(lsample, rsample, width)
\end{verbatim}\ecode
%
If you use the ADPCM coder to build network packets and you want your
protocol to be stateless (i.e.\ to be able to tolerate packet loss)
you should not only transmit the data but also the state.  Note that
you should send the \var{initial} state (the one you passed to
\code{lin2adpcm}) along to the decoder, not the final state (as returned by
the coder).  If you want to use \code{struct} to store the state in
binary you can code the first element (the predicted value) in 16 bits
and the second (the delta index) in 8.

The ADPCM coders have never been tried against other ADPCM coders,
only against themselves.  It could well be that I misinterpreted the
standards in which case they will not be interoperable with the
respective standards.

The \code{find...} routines might look a bit funny at first sight.
They are primarily meant to do echo cancellation.  A reasonably
fast way to do this is to pick the most energetic piece of the output
sample, locate that in the input sample and subtract the whole output
sample from the input sample:
\bcode\begin{verbatim}
def echocancel(outputdata, inputdata):
    pos = audioop.findmax(outputdata, 800)    # one tenth second
    out_test = outputdata[pos*2:]
    in_test = inputdata[pos*2:]
    ipos, factor = audioop.findfit(in_test, out_test)
    # Optional (for better cancellation):
    # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], 
    #              out_test)
    prefill = '\0'*(pos+ipos)*2
    postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata))
    outputdata = prefill + audioop.mul(outputdata,2,-factor) + postfill
    return audioop.add(inputdata, outputdata, 2)
\end{verbatim}\ecode
