[Scummvm-cvs-logs] CVS: scummvm/scumm/imuse_digi dimuse.cpp,1.66,1.67 dimuse.h,1.41,1.42

Pawel Kolodziejski aquadran at users.sourceforge.net
Sun Apr 11 12:11:01 CEST 2004


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

Modified Files:
	dimuse.cpp dimuse.h 
Log Message:
add initial code for pull procedure

Index: dimuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- dimuse.cpp	11 Apr 2004 14:56:11 -0000	1.66
+++ dimuse.cpp	11 Apr 2004 18:56:32 -0000	1.67
@@ -78,6 +78,72 @@
 	_nextSeqToPlay = 0;
 }
 
+void IMuseDigital::poolDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStream *stream) {
+	Common::StackLock lock(_mutex, "IMuseDigital::poolDataForMixer()");
+	for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
+		if (_track[l]->stream == stream) {
+			int32 mixer_size = pullSize;
+			byte *data = NULL;
+			int32 result = 0, pos = 0;
+
+			if (_track[l]->curRegion == -1)
+				switchToNextRegion(l);
+
+			int bits = _sound->getBits(_track[l]->soundHandle);
+			do {
+				if (bits == 12) {
+					byte *ptr = NULL;
+
+					mixer_size += _track[l]->mod;
+					int mixer_size_12 = (mixer_size * 3) / 4;
+					int length = (mixer_size_12 / 3) * 4;
+					_track[l]->mod = mixer_size - length;
+
+					int32 offset = (_track[l]->regionOffset * 3) / 4;
+					int result2 = _sound->getDataFromRegion(_track[l]->soundHandle, _track[l]->curRegion, &ptr, offset, mixer_size_12);
+					result = BundleCodecs::decode12BitsSample(ptr, &data, result2);
+
+					free(ptr);
+				} else if (bits == 16) {
+					result = _sound->getDataFromRegion(_track[l]->soundHandle, _track[l]->curRegion, &data, _track[l]->regionOffset, mixer_size);
+					if (_sound->getChannels(_track[l]->soundHandle) == 1) {
+						result &= ~1;
+					}
+					if (_sound->getChannels(_track[l]->soundHandle) == 2) {
+						if (result & 2)
+							result &= ~2;
+					}
+				} else if (bits == 8) {
+					result = _sound->getDataFromRegion(_track[l]->soundHandle, _track[l]->curRegion, &data, _track[l]->regionOffset, mixer_size);
+					if (_sound->getChannels(_track[l]->soundHandle) == 2) {
+						result &= ~1;
+					}
+				}
+
+				if (result > mixer_size)
+					result = mixer_size;
+
+				memcpy(mixerBuffer + pos, data, result);
+				pos += result;
+				free(data);
+
+				_track[l]->regionOffset += result;
+				_track[l]->trackOffset += result;
+					
+				if (_sound->isEndOfRegion(_track[l]->soundHandle, _track[l]->curRegion)) {
+					switchToNextRegion(l);
+					if (_track[l]->toBeRemoved)
+						break;
+				}
+				mixer_size -= result;
+				assert(mixer_size >= 0);
+			} while (mixer_size != 0);
+			return;
+		}
+	}
+	error("IMuseDigital::poolDataForMixer() Can't match streams");
+}
+
 void IMuseDigital::callback() {
 	Common::StackLock lock(_mutex, "IMuseDigital::callback()");
 	int l = 0;

Index: dimuse.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse.h,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- dimuse.h	11 Apr 2004 14:48:50 -0000	1.41
+++ dimuse.h	11 Apr 2004 18:56:32 -0000	1.42
@@ -93,6 +93,7 @@
 	int _curMusicCue;
 
 	static void timer_handler(void *refConf);
+	void poolDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStream *stream);
 	void callback();
 	void switchToNextRegion(int track);
 	void allocSlot(int priority);





More information about the Scummvm-git-logs mailing list