diff options
| author | Max Horn | 2003-07-24 21:26:00 +0000 | 
|---|---|---|
| committer | Max Horn | 2003-07-24 21:26:00 +0000 | 
| commit | 09263a1febc4ff1adf69d81bf4d225340484df02 (patch) | |
| tree | 4bd791723477857f51c1d0714a0d63cd605b26a7 /sound/resample.cpp | |
| parent | 1622ac31dafee837cb3011c558dfcd93c5bb1ca6 (diff) | |
| download | scummvm-rg350-09263a1febc4ff1adf69d81bf4d225340484df02.tar.gz scummvm-rg350-09263a1febc4ff1adf69d81bf4d225340484df02.tar.bz2 scummvm-rg350-09263a1febc4ff1adf69d81bf4d225340484df02.zip | |
added volume support; some cleanup; provided exactly as many samples as were requested in the 'resample' algorithm (if possible)
svn-id: r9180
Diffstat (limited to 'sound/resample.cpp')
| -rw-r--r-- | sound/resample.cpp | 67 | 
1 files changed, 39 insertions, 28 deletions
| diff --git a/sound/resample.cpp b/sound/resample.cpp index 825760236b..3bbd3d18ca 100644 --- a/sound/resample.cpp +++ b/sound/resample.cpp @@ -113,7 +113,7 @@ static long SrcEX(resample_t r, long Nx);  /*   * Process options   */ -int st_resample_getopts(eff_t effp, int n, char **argv) { +int st_resample_getopts(eff_t effp, int n, const char **argv) {  	resample_t r = (resample_t) effp->priv;  	/* These defaults are conservative with respect to aliasing. */ @@ -262,37 +262,37 @@ int st_resample_start(eff_t effp, st_rate_t inrate, st_rate_t outrate) {   * Processed signed long samples from ibuf to obuf.   * Return number of samples processed.   */ -int st_resample_flow(eff_t effp, AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp) { +int st_resample_flow(eff_t effp, AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) {  	resample_t r = (resample_t) effp->priv;  	long i, k, last; -	long Nout;		// The number of bytes we effectively output +	long Nout = 0;	// The number of bytes we effectively output  	long Nx;		// The number of bytes we will read from input  	long Nproc;		// The number of bytes we process to generate Nout output bytes -  #if 1	// FIXME: Hack to generate stereo output -	*osamp >>= 1; +	const long obufSize = *osamp / 2; +#else +	const long obufSize = *osamp;  #endif -	/* constrain amount we actually process */ -	fprintf(stderr,"Xp %d, Xread %d\n",r->Xp, r->Xread); +	// Constrain amount we actually process +	//fprintf(stderr,"Xp %d, Xread %d\n",r->Xp, r->Xread);  	// Initially assume we process the full X buffer starting at the filter  	// start position.  	Nproc = r->Xsize - r->Xp; -printf("FOO(1) Nproc %ld\n", Nproc);  	// Nproc is bounded indirectly by the size of output buffer, and also by  	// the remaining size of the Y buffer (whichever is smaller). -	i = MIN(r->Ysize - r->Yposition, (long)*osamp); -	if (Nproc * r->Factor >= i) -		Nproc = (long)(i / r->Factor); - -printf("FOO(2) Nproc %ld\n", Nproc); +	// We round up for the output buffer, because we want to generate enough +	// bytes to fill it. +	i = MIN((long)((r->Ysize - r->Yposition) / r->Factor), (long)ceil((obufSize - r->Yposition) / r->Factor)); +	if (Nproc > i) +		Nproc = i;  	// Now that we know how many bytes we want to process, we determine  	// how many bytes to read. We already have Xread bytes in our input  	// buffer, so we need Nproc - r->Xread more bytes. -	Nx = Nproc - r->Xread + r->Xoff + r->Xp; // FIXME: Fingolfing thinks this is the correct thing, not what's in the next line! +	Nx = Nproc - r->Xread + r->Xoff + r->Xp; // FIXME: Fingolfin thinks this is the correct thing, not what's in the next line!  //	Nx = Nproc - r->Xread; /* space for right-wing future-data */  	if (Nx <= 0) {  		st_fail("resample: Can not handle this sample rate change. Nx not positive: %d", Nx); @@ -324,7 +324,7 @@ printf("FOO(3) Nproc %ld\n", Nproc);  	}  	if (r->quadr < 0) { /* exact coeff's method */  		long creep; -		Nout = SrcEX(r, Nproc); +		Nout = SrcEX(r, Nproc) + r->Yposition;  		fprintf(stderr,"Nproc %d --> %d\n",Nproc,Nout);  		/* Move converter Nproc samples back in time */  		r->t -= Nproc * r->b; @@ -339,7 +339,7 @@ printf("FOO(3) Nproc %ld\n", Nproc);  		}  	} else { /* approx coeff's method */  		long creep; -		Nout = SrcUD(r, Nproc); +		Nout = SrcUD(r, Nproc) + r->Yposition;  		fprintf(stderr,"Nproc %d --> %d\n",Nproc,Nout);  		/* Move converter Nproc samples back in time */  		r->Time -= Nproc; @@ -364,20 +364,31 @@ printf("FOO(3) Nproc %ld\n", Nproc);  	r->Xread = i;  	r->Xp = r->Xoff; -printf("osamp = %d, Nout = %ld\n", *osamp, Nout); -	for (i = 0; i < Nout; i++) { -		clampedAdd(*obuf++, (int)r->Y[i]); +printf("osamp = %ld, Nout = %ld\n", obufSize, Nout); +	long numOutSamples = MIN(obufSize, Nout); +	for (i = 0; i < numOutSamples; i++) { +		int sample = (int)(r->Y[i] * vol / 256); +		clampedAdd(*obuf++, sample);  #if 1	// FIXME: Hack to generate stereo output -		clampedAdd(*obuf++, (int)r->Y[i]); +		clampedAdd(*obuf++, sample);  #endif  	} -	// At this point, we used *osamp bytes out of Nout available bytes in the Y buffer. -	// If there are any bytes remaining, shift them to the start of the buffer, -	// and update Yposition - - -	*osamp = Nout; +	// Move down the remaining Y bytes +	for (i = numOutSamples; i < Nout; i++) { +		r->Y[i-numOutSamples] = r->Y[i]; +	} +	if (Nout > numOutSamples) +		r->Yposition = Nout - numOutSamples; +	else +		r->Yposition = 0; +	 +	// Finally set *osamp to the number of samples we put into the output buffer +#if 1	// FIXME: Hack to generate stereo output +	*osamp = numOutSamples * 2; +#else +	*osamp = numOutSamples; +#endif  	return (ST_SUCCESS);  } @@ -385,7 +396,7 @@ printf("osamp = %d, Nout = %ld\n", *osamp, Nout);  /*   * Process tail of input samples.   */ -int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp) { +int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) {  	resample_t r = (resample_t) effp->priv;  	long isamp_res, osamp_res;  	st_sample_t *Obuf; @@ -401,7 +412,7 @@ int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp) {  		st_sample_t Osamp;  		Osamp = osamp_res;  		ZeroInputStream zero(isamp_res); -		rc = st_resample_flow(effp, zero, Obuf, (st_size_t *) & Osamp); +		rc = st_resample_flow(effp, zero, Obuf, (st_size_t *) & Osamp, vol);  		if (rc)  			return rc;  		/*fprintf(stderr,"DRAIN isamp,osamp	(%d,%d) -> (%d,%d)\n", | 
