some cleanup
svn-id: r9575
This commit is contained in:
parent
32107ae69a
commit
69ee268e7f
5 changed files with 90 additions and 78 deletions
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "sound/mixer.h"
|
#include "sound/mixer.h"
|
||||||
#include "sound/rate.h"
|
#include "sound/rate.h"
|
||||||
|
#include "sound/audiostream.h"
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "sound/rate.h"
|
#include "sound/rate.h"
|
||||||
|
#include "sound/audiostream.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The precision of the fractional computations used by the rate converter.
|
* The precision of the fractional computations used by the rate converter.
|
||||||
|
|
|
@ -22,13 +22,12 @@
|
||||||
#ifndef SOUND_RATE_H
|
#ifndef SOUND_RATE_H
|
||||||
#define SOUND_RATE_H
|
#define SOUND_RATE_H
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
#include "common/engine.h"
|
#include "common/engine.h"
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
|
|
||||||
#include "sound/audiostream.h"
|
//#include "sound/audiostream.h"
|
||||||
|
class AudioInputStream;
|
||||||
|
|
||||||
typedef int16 st_sample_t;
|
typedef int16 st_sample_t;
|
||||||
typedef uint16 st_volume_t;
|
typedef uint16 st_volume_t;
|
||||||
|
|
|
@ -50,18 +50,55 @@
|
||||||
* Get the idea? :)
|
* Get the idea? :)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdlib.h>
|
#include "sound/resample.h"
|
||||||
#include <string.h>
|
#include "sound/audiostream.h"
|
||||||
#include "rate.h"
|
|
||||||
|
|
||||||
/* resample includes */
|
|
||||||
#include "resample.h"
|
|
||||||
|
|
||||||
typedef struct {
|
/* Conversion constants */
|
||||||
byte priv[1024];
|
#define Lc 7
|
||||||
} eff_struct;
|
#define Nc (1<<Lc)
|
||||||
typedef eff_struct *eff_t;
|
#define La 16
|
||||||
|
#define Na (1<<La)
|
||||||
|
#define Lp (Lc+La)
|
||||||
|
#define Np (1<<Lp)
|
||||||
|
#define Amask (Na-1)
|
||||||
|
#define Pmask (Np-1)
|
||||||
|
|
||||||
|
#define MAXNWING (80<<Lc)
|
||||||
|
/* Description of constants:
|
||||||
|
*
|
||||||
|
* Nc - is the number of look-up values available for the lowpass filter
|
||||||
|
* between the beginning of its impulse response and the "cutoff time"
|
||||||
|
* of the filter. The cutoff time is defined as the reciprocal of the
|
||||||
|
* lowpass-filter cut off frequence in Hz. For example, if the
|
||||||
|
* lowpass filter were a sinc function, Nc would be the index of the
|
||||||
|
* impulse-response lookup-table corresponding to the first zero-
|
||||||
|
* crossing of the sinc function. (The inverse first zero-crossing
|
||||||
|
* time of a sinc function equals its nominal cutoff frequency in Hz.)
|
||||||
|
* Nc must be a power of 2 due to the details of the current
|
||||||
|
* implementation. The default value of 128 is sufficiently high that
|
||||||
|
* using linear interpolation to fill in between the table entries
|
||||||
|
* gives approximately 16-bit precision, and quadratic interpolation
|
||||||
|
* gives about 23-bit (float) precision in filter coefficients.
|
||||||
|
*
|
||||||
|
* Lc - is log base 2 of Nc.
|
||||||
|
*
|
||||||
|
* La - is the number of bits devoted to linear interpolation of the
|
||||||
|
* filter coefficients.
|
||||||
|
*
|
||||||
|
* Lp - is La + Lc, the number of bits to the right of the binary point
|
||||||
|
* in the integer "time" variable. To the left of the point, it indexes
|
||||||
|
* the input array (X), and to the right, it is interpreted as a number
|
||||||
|
* between 0 and 1 sample of the input X. The default value of 23 is
|
||||||
|
* about right. There is a constraint that the filter window must be
|
||||||
|
* "addressable" in a int32_t, more precisely, if Nmult is the number
|
||||||
|
* of sinc zero-crossings in the right wing of the filter window, then
|
||||||
|
* (Nwing<<Lp) must be expressible in 31 bits.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* this Float MUST match that in filter.c */
|
/* this Float MUST match that in filter.c */
|
||||||
#define Float double/*float*/
|
#define Float double/*float*/
|
||||||
|
@ -284,6 +321,7 @@ int st_resample_flow(eff_t effp, AudioInputStream &input, st_sample_t *obuf, st_
|
||||||
long Nproc; // The number of bytes we process to generate Nout output bytes
|
long Nproc; // The number of bytes we process to generate Nout output bytes
|
||||||
const long obufSize = *osamp;
|
const long obufSize = *osamp;
|
||||||
|
|
||||||
|
/*
|
||||||
TODO: adjust for the changes made to AudioInputStream; add support for stereo
|
TODO: adjust for the changes made to AudioInputStream; add support for stereo
|
||||||
initially, could just average the left/right channel -> bad for quality of course,
|
initially, could just average the left/right channel -> bad for quality of course,
|
||||||
but easiest to implement and would get this going again.
|
but easiest to implement and would get this going again.
|
||||||
|
@ -293,6 +331,7 @@ But better for efficiency would be to rewrite those to deal with 2 channels, too
|
||||||
Because esp in SrcEX/SrcUD, only very few computations depend on the input data,
|
Because esp in SrcEX/SrcUD, only very few computations depend on the input data,
|
||||||
and dealing with both channels in parallel should only be a little slower than dealing
|
and dealing with both channels in parallel should only be a little slower than dealing
|
||||||
with them alone
|
with them alone
|
||||||
|
*/
|
||||||
|
|
||||||
// Constrain amount we actually process
|
// Constrain amount we actually process
|
||||||
//fprintf(stderr,"Xp %d, Xread %d\n",r->Xp, r->Xread);
|
//fprintf(stderr,"Xp %d, Xread %d\n",r->Xp, r->Xread);
|
||||||
|
@ -740,17 +779,6 @@ static void LpFilter(double *c, long N, double frq, double Beta, long Num) {
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
|
|
||||||
class ResampleRateConverter : public RateConverter {
|
|
||||||
protected:
|
|
||||||
eff_struct effp;
|
|
||||||
public:
|
|
||||||
ResampleRateConverter(st_rate_t inrate, st_rate_t outrate, int quality);
|
|
||||||
~ResampleRateConverter();
|
|
||||||
virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol);
|
|
||||||
virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
ResampleRateConverter::ResampleRateConverter(st_rate_t inrate, st_rate_t outrate, int quality) {
|
ResampleRateConverter::ResampleRateConverter(st_rate_t inrate, st_rate_t outrate, int quality) {
|
||||||
// FIXME: quality is for now a nasty hack.
|
// FIXME: quality is for now a nasty hack.
|
||||||
// Valid values are 0,1,2,3 (everything else is treated like 0 for now)
|
// Valid values are 0,1,2,3 (everything else is treated like 0 for now)
|
||||||
|
|
|
@ -1,61 +1,44 @@
|
||||||
/*
|
/* ScummVM - Scumm Interpreter
|
||||||
* FILE: resample.h
|
* Copyright (C) 2001-2003 The ScummVM project
|
||||||
* BY: Julius Smith (at CCRMA, Stanford U)
|
|
||||||
* C BY: translated from SAIL to C by Christopher Lee Fraley
|
|
||||||
* (cf0v@andrew.cmu.edu)
|
|
||||||
* DATE: 7-JUN-88
|
|
||||||
* VERS: 2.0 (17-JUN-88, 3:00pm)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* October 29, 1999
|
|
||||||
* Various changes, bugfixes(?), increased precision, by Stan Brooks.
|
|
||||||
*
|
*
|
||||||
* This source code is distributed in the hope that it will be useful,
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* $Header$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Conversion constants */
|
#ifndef SOUND_RESAMPLE_H
|
||||||
#define Lc 7
|
#define SOUND_RESAMPLE_H
|
||||||
#define Nc (1<<Lc)
|
|
||||||
#define La 16
|
|
||||||
#define Na (1<<La)
|
|
||||||
#define Lp (Lc+La)
|
|
||||||
#define Np (1<<Lp)
|
|
||||||
#define Amask (Na-1)
|
|
||||||
#define Pmask (Np-1)
|
|
||||||
|
|
||||||
#define MAXNWING (80<<Lc)
|
#include "sound/rate.h"
|
||||||
/* Description of constants:
|
|
||||||
*
|
typedef struct {
|
||||||
* Nc - is the number of look-up values available for the lowpass filter
|
byte priv[1024];
|
||||||
* between the beginning of its impulse response and the "cutoff time"
|
} eff_struct;
|
||||||
* of the filter. The cutoff time is defined as the reciprocal of the
|
typedef eff_struct *eff_t;
|
||||||
* lowpass-filter cut off frequence in Hz. For example, if the
|
|
||||||
* lowpass filter were a sinc function, Nc would be the index of the
|
/** High quality rate conversion algorithm, based on SoX (http://sox.sourceforge.net). */
|
||||||
* impulse-response lookup-table corresponding to the first zero-
|
class ResampleRateConverter : public RateConverter {
|
||||||
* crossing of the sinc function. (The inverse first zero-crossing
|
protected:
|
||||||
* time of a sinc function equals its nominal cutoff frequency in Hz.)
|
eff_struct effp;
|
||||||
* Nc must be a power of 2 due to the details of the current
|
public:
|
||||||
* implementation. The default value of 128 is sufficiently high that
|
ResampleRateConverter(st_rate_t inrate, st_rate_t outrate, int quality);
|
||||||
* using linear interpolation to fill in between the table entries
|
~ResampleRateConverter();
|
||||||
* gives approximately 16-bit precision, and quadratic interpolation
|
virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol);
|
||||||
* gives about 23-bit (float) precision in filter coefficients.
|
virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol);
|
||||||
*
|
};
|
||||||
* Lc - is log base 2 of Nc.
|
|
||||||
*
|
|
||||||
* La - is the number of bits devoted to linear interpolation of the
|
#endif
|
||||||
* filter coefficients.
|
|
||||||
*
|
|
||||||
* Lp - is La + Lc, the number of bits to the right of the binary point
|
|
||||||
* in the integer "time" variable. To the left of the point, it indexes
|
|
||||||
* the input array (X), and to the right, it is interpreted as a number
|
|
||||||
* between 0 and 1 sample of the input X. The default value of 23 is
|
|
||||||
* about right. There is a constraint that the filter window must be
|
|
||||||
* "addressable" in a int32_t, more precisely, if Nmult is the number
|
|
||||||
* of sinc zero-crossings in the right wing of the filter window, then
|
|
||||||
* (Nwing<<Lp) must be expressible in 31 bits.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue