[Scummvm-cvs-logs] CVS: scummvm/scumm/imuse_digi dimuse.cpp,1.69,1.70 dimuse.h,1.43,1.44 dimuse_track.cpp,1.4,1.5

Pawel Kolodziejski aquadran at users.sourceforge.net
Mon Apr 12 23:44:05 CEST 2004


Update of /cvsroot/scummvm/scummvm/scumm/imuse_digi
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16101

Modified Files:
	dimuse.cpp dimuse.h dimuse_track.cpp 
Log Message:
added experimental and buggy pull method to imuse, it's disabled by default, to enable uncoment in dimuse.h define #ENABLE_PULLMETHOD

Index: dimuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse.cpp,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -d -r1.69 -r1.70
--- dimuse.cpp	11 Apr 2004 18:58:50 -0000	1.69
+++ dimuse.cpp	13 Apr 2004 06:29:34 -0000	1.70
@@ -78,10 +78,19 @@
 	_nextSeqToPlay = 0;
 }
 
-void IMuseDigital::pullDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStream *stream) {
-	Common::StackLock lock(_mutex, "IMuseDigital::pullDataForMixer()");
+#ifdef ENABLE_PULLMETHOD
+
+int IMuseDigital::pullProcCallback(void *refCon, CustomProcInputStream *stream, byte *mixerBuffer, int pullSize) {
+	IMuseDigital *imuseDigital = (IMuseDigital *)refCon;
+	return imuseDigital->pullProc(stream, mixerBuffer, pullSize);
+}
+
+int IMuseDigital::pullProc(CustomProcInputStream *stream, byte *mixerBuffer, int pullSize) {
+	Common::StackLock lock(_mutex, "IMuseDigital::pullProc()");
 	for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
 		if (_track[l]->stream == stream) {
+			_vm->_mixer->setChannelVolume(_track[l]->handle, _track[l]->mixerVol);
+			_vm->_mixer->setChannelBalance(_track[l]->handle, _track[l]->mixerPan);
 			int32 mixer_size = pullSize;
 			byte *data = NULL;
 			int32 result = 0, pos = 0;
@@ -114,6 +123,10 @@
 							result &= ~2;
 					}
 				} else if (bits == 8) {
+					memset(mixerBuffer, 0x80, pullSize); 
+					_track[l]->toBeRemoved = true;
+					return pullSize;
+
 					result = _sound->getDataFromRegion(_track[l]->soundHandle, _track[l]->curRegion, &data, _track[l]->regionOffset, mixer_size);
 					if (_sound->getChannels(_track[l]->soundHandle) == 2) {
 						result &= ~1;
@@ -132,16 +145,18 @@
 					
 				if (_sound->isEndOfRegion(_track[l]->soundHandle, _track[l]->curRegion)) {
 					switchToNextRegion(l);
-					if (_track[l]->toBeRemoved)
-						break;
+					if (_track[l]->toBeRemoved) {
+						mixer_size -= result;
+						return pullSize - mixer_size;
+					}
 				}
 				mixer_size -= result;
 				assert(mixer_size >= 0);
 			} while (mixer_size != 0);
-			return;
+			return pullSize;
 		}
 	}
-	error("IMuseDigital::pullDataForMixer() Can't match streams");
+	error("IMuseDigital::pullProc() Can't match streams");
 }
 
 void IMuseDigital::callback() {
@@ -207,6 +222,89 @@
 			if (_track[l]->volGroupId == 3)
 				vol = (vol * _volMusic) / 128;
 
+			_track[l]->mixerVol = vol;
+			_track[l]->mixerPan = pan;
+
+			if (_vm->_mixer->isReady()) {
+				if (_track[l]->stream2) {
+					if (!_track[l]->started) {
+						_track[l]->started = true;
+						_vm->_mixer->playInputStream(&_track[l]->handle, _track[l]->stream2, false, _track[l]->vol / 1000, _track[l]->pan, -1, false);
+					} else {
+						_vm->_mixer->setChannelVolume(_track[l]->handle, vol);
+						_vm->_mixer->setChannelBalance(_track[l]->handle, pan);
+					}
+				}
+			}
+		}
+	}
+}
+
+#else
+
+void IMuseDigital::callback() {
+	Common::StackLock lock(_mutex, "IMuseDigital::callback()");
+	int l = 0;
+
+	if (_pause || !_vm)
+		return;
+
+	for (l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
+		if (_track[l]->used) {
+			if (_track[l]->stream2) {
+				if (!_track[l]->handle.isActive() && _track[l]->started) {
+					debug(5, "IMuseDigital::callback() A: stopped sound: %d", _track[l]->soundId);
+					delete _track[l]->stream2;
+					_track[l]->stream2 = NULL;
+					_track[l]->used = false;
+					continue;
+				}
+			} else if (_track[l]->stream) {
+				if (_track[l]->toBeRemoved) {
+					debug(5, "IMuseDigital::callback() B: stopped sound: %d", _track[l]->soundId);
+					_track[l]->stream->finish();
+					_track[l]->stream = NULL;
+					_sound->closeSound(_track[l]->soundHandle);
+					_track[l]->soundHandle = NULL;
+					_track[l]->used = false;
+					continue;
+				}
+			}
+
+			if (_track[l]->volFadeUsed) {
+				if (_track[l]->volFadeStep < 0) {
+					if (_track[l]->vol > _track[l]->volFadeDest) {
+						_track[l]->vol += _track[l]->volFadeStep;
+						if (_track[l]->vol < _track[l]->volFadeDest) {
+							_track[l]->vol = _track[l]->volFadeDest;
+							_track[l]->volFadeUsed = false;
+						}
+						if (_track[l]->vol == 0) {
+							_track[l]->toBeRemoved = true;
+						}
+					}
+				} else if (_track[l]->volFadeStep > 0) {
+					if (_track[l]->vol < _track[l]->volFadeDest) {
+						_track[l]->vol += _track[l]->volFadeStep;
+						if (_track[l]->vol > _track[l]->volFadeDest) {
+							_track[l]->vol = _track[l]->volFadeDest;
+							_track[l]->volFadeUsed = false;
+						}
+					}
+				}
+				debug(5, "Fade: sound(%d), Vol(%d)", _track[l]->soundId, _track[l]->vol / 1000);
+			}
+
+			int pan = (_track[l]->pan != 64) ? 2 * _track[l]->pan - 127 : 0;
+			int vol = _track[l]->vol / 1000;
+
+			if (_track[l]->volGroupId == 1)
+				vol = (vol * _volVoice) / 128;
+			if (_track[l]->volGroupId == 2)
+				vol = (vol * _volSfx) / 128;
+			if (_track[l]->volGroupId == 3)
+				vol = (vol * _volMusic) / 128;
+
 			if (_vm->_mixer->isReady()) {
 				if (_track[l]->stream2) {
 					if (!_track[l]->started) {
@@ -287,6 +385,7 @@
 		}
 	}
 }
+#endif
 
 void IMuseDigital::switchToNextRegion(int track) {
 	if (track >= MAX_DIGITAL_TRACKS) {

Index: dimuse.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse.h,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- dimuse.h	11 Apr 2004 18:57:44 -0000	1.43
+++ dimuse.h	13 Apr 2004 06:29:34 -0000	1.44
@@ -33,6 +33,10 @@
 
 namespace Scumm {
 
+// enable below for pullmethod data transfer from imuse to sound mixer,
+// it's experimental and buggy
+//#define ENABLE_PULLMETHOD
+
 #define MAX_DIGITAL_TRACKS 8
 #define MAX_DIGITAL_FADETRACKS 8
 
@@ -63,12 +67,20 @@
 		int volGroupId;
 		int iteration;
 		int mod;
+#ifndef ENABLE_PULLMETHOD
 		int32 pullSize;
+#endif
 		int32 mixerFlags;
+		int mixerVol;
+		int mixerPan;
 
 		ImuseDigiSndMgr::soundStruct *soundHandle;
 		PlayingSoundHandle handle;
+#ifndef ENABLE_PULLMETHOD
 		AppendableAudioStream *stream;
+#else
+		CustomProcInputStream *stream;
+#endif
 		AudioStream *stream2;
 
 		Track();
@@ -93,7 +105,10 @@
 	int _curMusicCue;
 
 	static void timer_handler(void *refConf);
-	void pullDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStream *stream);
+#ifdef ENABLE_PULLMETHOD
+	static int pullProcCallback(void *refCon, CustomProcInputStream *stream, byte *mixerBuffer, int pullSize);
+	int pullProc(CustomProcInputStream *stream, byte *mixerBuffer, int pullSize);
+#endif
 	void callback();
 	void switchToNextRegion(int track);
 	void allocSlot(int priority);

Index: dimuse_track.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse_track.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- dimuse_track.cpp	11 Apr 2004 14:48:50 -0000	1.4
+++ dimuse_track.cpp	13 Apr 2004 06:29:34 -0000	1.5
@@ -58,9 +58,14 @@
 				}
 			}
 			assert(track_id != -1);
+#ifndef ENABLE_PULLMETHOD
 			_track[track_id]->stream->finish();
 			_track[track_id]->stream = NULL;
 			_vm->_mixer->stopHandle(_track[track_id]->handle);
+#else
+			_vm->_mixer->stopHandle(_track[track_id]->handle);
+			_track[track_id]->stream = NULL;
+#endif
 			_sound->closeSound(_track[track_id]->soundHandle);
 			_track[track_id]->used = false;
 			assert(!_track[track_id]->handle.isActive());
@@ -98,6 +103,8 @@
 			_track[l]->trackOffset = 0;
 			_track[l]->mod = 0;
 			_track[l]->mixerFlags = 0;
+			_track[l]->mixerPan = 0;
+			_track[l]->mixerVol = volume;
 			_track[l]->toBeRemoved = false;
 
 			int bits = 0, freq = 0, channels = 0;
@@ -136,29 +143,42 @@
 				// subclass).
 				freq -= (freq % 25);
 
-				_track[l]->iteration = _track[l]->pullSize = freq * channels;
-
+				_track[l]->iteration = freq * channels;
+#ifndef ENABLE_PULLMETHOD
+				_track[l]->pullSize = _track[l]->iteration;
+#endif
 				if (channels == 2)
 					_track[l]->mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
 
 				if ((bits == 12) || (bits == 16)) {
 					_track[l]->mixerFlags |= SoundMixer::FLAG_16BITS;
-					_track[l]->iteration = _track[l]->pullSize *= 2;
+					_track[l]->iteration *= 2;
+#ifndef ENABLE_PULLMETHOD
+					_track[l]->pullSize = _track[l]->iteration;
+#endif
 				} else if (bits == 8) {
 					_track[l]->mixerFlags |= SoundMixer::FLAG_UNSIGNED;
 				} else
 					error("IMuseDigital::startSound(): Can't handle %d bit samples", bits);
 
+#ifndef ENABLE_PULLMETHOD
 				_track[l]->pullSize /= 25;	// We want a "frame rate" of 25 audio blocks per second
+#endif
 			}
 
 			if (input) {
 				_track[l]->stream2 = input;
 				_track[l]->stream = NULL;
+				_track[l]->started = false;
 			} else {
 				_track[l]->stream2 = NULL;
+#ifndef ENABLE_PULLMETHOD
 				_track[l]->stream = makeAppendableAudioStream(freq, _track[l]->mixerFlags, 100000);
+#else
+				_track[l]->stream = new CustomProcInputStream(freq, _track[l]->mixerFlags, (CustomProcInputStream::CustomInputProc)pullProcCallback, this);
+#endif
 				_vm->_mixer->playInputStream(&_track[l]->handle, _track[l]->stream, false, _track[l]->vol / 1000, _track[l]->pan, -1);
+				_track[l]->started = true;
 			}
 
 			_track[l]->used = true;
@@ -276,8 +296,12 @@
 	_track[track]->curHookId = _track[fadeTrack]->curHookId;
 	_track[track]->iteration = _track[fadeTrack]->iteration;
 	_track[track]->mixerFlags = _track[fadeTrack]->mixerFlags;
+	_track[track]->mixerVol = _track[fadeTrack]->mixerVol;
+	_track[track]->mixerPan = _track[fadeTrack]->mixerPan;
 	_track[track]->mod = _track[fadeTrack]->mod;
+#ifndef ENABLE_PULLMETHOD
 	_track[track]->pullSize = _track[fadeTrack]->pullSize;
+#endif
 	_track[track]->used = _track[fadeTrack]->used;
 	_track[track]->toBeRemoved = _track[fadeTrack]->toBeRemoved;
 	_track[track]->started = _track[fadeTrack]->started;
@@ -295,8 +319,13 @@
 		_track[track]->used = false;
 	} else {
 		_track[track]->soundHandle = _sound->cloneSound(_track[fadeTrack]->soundHandle);
+#ifndef ENABLE_PULLMETHOD
 		_track[track]->stream = makeAppendableAudioStream(_sound->getFreq(_track[track]->soundHandle), _track[track]->mixerFlags, 100000);
+#else
+		_track[track]->stream = new CustomProcInputStream(_sound->getFreq(_track[track]->soundHandle), _track[track]->mixerFlags, (CustomProcInputStream::CustomInputProc)pullProcCallback, this);
+#endif
 		_vm->_mixer->playInputStream(&_track[track]->handle, _track[track]->stream, false, _track[track]->vol / 1000, _track[track]->pan, -1);
+		_track[track]->started = true;
 	}
 
 	return fadeTrack;





More information about the Scummvm-git-logs mailing list