[Scummvm-cvs-logs] SF.net SVN: scummvm: [21239] scummvm/trunk/engines/kyra/sound_adlib.cpp

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Sun Mar 12 09:51:01 CET 2006


Revision: 21239
Author:   eriktorbjorn
Date:     2006-03-12 09:50:36 -0800 (Sun, 12 Mar 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21239&view=rev

Log Message:
-----------
Compensate for rounding errors in _samplesPerCallback by having readBuffer()
generate "leap samples". I doubt this will make any noticeable difference, but
at least now we can probably rule out timer inaccuracies from the list of
possible suspects for the remaining bugs.

Also removed unnecessary mutex locking/unlocking from readBuffer(), spotted by
LordHoto.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/sound_adlib.cpp
Modified: scummvm/trunk/engines/kyra/sound_adlib.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_adlib.cpp	2006-03-12 17:08:46 UTC (rev 21238)
+++ scummvm/trunk/engines/kyra/sound_adlib.cpp	2006-03-12 17:50:36 UTC (rev 21239)
@@ -34,6 +34,8 @@
 // Basic Adlib Programming:
 // http://www.gamedev.net/reference/articles/article446.asp
 
+#define CALLBACKS_PER_SECOND 72
+
 namespace Kyra {
 
 class AdlibDriver : public AudioStream {
@@ -48,11 +50,15 @@
 	int readBuffer(int16 *buffer, const int numSamples) {
 		int samplesLeft = numSamples;
 		memset(buffer, 0, sizeof(int16) * numSamples);
-		lock();
 		while (samplesLeft) {
 			if (!_samplesTillCallback) {
 				callback();
 				_samplesTillCallback = _samplesPerCallback;
+				_samplesTillCallbackRemainder += _samplesPerCallbackRemainder;
+				if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) {
+					_samplesTillCallback++;
+					_samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND;
+				}
 			}
 
 			int32 render = MIN(samplesLeft, _samplesTillCallback);
@@ -61,7 +67,6 @@
 			YM3812UpdateOne(_adlib, buffer, render);
 			buffer += render;
 		}
-		unlock();
 		return numSamples;
 	}
 
@@ -312,7 +317,9 @@
 	// _unkTable2_3[]  - One of the tables in _unkTable2[]
 
 	int32 _samplesPerCallback;
+	int32 _samplesPerCallbackRemainder;
 	int32 _samplesTillCallback;
+	int32 _samplesTillCallbackRemainder;
 
 	int _lastProcessed;
 	int8 _flagTrigger;
@@ -403,9 +410,10 @@
 
 	_mixer->setupPremix(this);
 
-	// FIXME: Handle the rounding error?
-	_samplesPerCallback = getRate() / 72;
+	_samplesPerCallback = getRate() / CALLBACKS_PER_SECOND;
+	_samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND;
 	_samplesTillCallback = 0;
+	_samplesTillCallbackRemainder = 0;
 }
 
 AdlibDriver::~AdlibDriver() {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list