[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