[Scummvm-cvs-logs] CVS: scummvm/scumm/smush channel.h,1.6,1.7 imuse_channel.cpp,1.9,1.10 player.cpp,1.14,1.15
Pawe? Ko?odziejski
aquadran at users.sourceforge.net
Sat Sep 21 02:22:02 CEST 2002
Update of /cvsroot/scummvm/scummvm/scumm/smush
In directory usw-pr-cvs1:/tmp/cvs-serv26312
Modified Files:
channel.h imuse_channel.cpp player.cpp
Log Message:
added support for sound volume for smush samples(IACT) in the dig (propably bad)
Index: channel.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/channel.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- channel.h 18 Sep 2002 08:06:14 -0000 1.6
+++ channel.h 21 Sep 2002 09:21:50 -0000 1.7
@@ -122,6 +122,7 @@
int32 _frequency; //!< the target frequency of the ::mixer
int32 _dataSize; //!< remaining size of sound data in the iMUS buffer
bool _inData;
+ int32 _volume;
int32 _bitsize; //!< the bitsize of the original data
int32 _rate; //!< the sampling rate of the original data
@@ -142,13 +143,13 @@
ImuseChannel(int32 track, int32 freq);
virtual ~ImuseChannel();
bool isTerminated() const;
- bool setParameters(int32 nbframes, int32 size, int32 unk1, int32 unk2);
- bool checkParameters(int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2);
+ bool setParameters(int32 nbframes, int32 size, int32 track_flags, int32 unk1);
+ bool checkParameters(int32 index, int32 nbframes, int32 size, int32 track_flags, int32 unk1);
bool appendData(Chunk & b, int32 size);
int32 availableSoundData() const;
void getSoundData(int16 * sound_buffer, int32 size);
void getSoundData(int8 * sound_buffer, int32 size);
- int32 getRate() { return _rate; }
+ int32 getRate() { return _rate; }
bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {
rate = _frequency;
stereo = (_channels == 2);
Index: imuse_channel.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/imuse_channel.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- imuse_channel.cpp 18 Sep 2002 08:38:29 -0000 1.9
+++ imuse_channel.cpp 21 Sep 2002 09:21:50 -0000 1.10
@@ -52,11 +52,23 @@
return (_dataSize <= 0 && _sbuffer == 0);
}
-bool ImuseChannel::setParameters(int32 nbframes, int32 size, int32 unk1, int32 unk2) {
+bool ImuseChannel::setParameters(int32 nb, int32 size, int32 flags, int32 unk1) {
+ // flags: 0 - 8 bits
+ // values:
+ // 1 - Voice
+ // 2 - Background music
+ // 0, 3-511 - SFX and volume
+ // FIXME: this should be better
+ if ((flags != 1) && (flags != 2) && ((flags >> 2) != 0)) {
+ _volume = 300 - ((flags >> 3) << 2);
+ }
+ else {
+ _volume = 127;
+ }
return true;
}
-bool ImuseChannel::checkParameters(int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2) {
+bool ImuseChannel::checkParameters(int32 index, int32 nbframes, int32 size, int32 track_flags, int32 unk1) {
return true;
}
@@ -171,18 +183,21 @@
}
int loop_size = _sbufferSize / 3;
int new_size = loop_size * 2;
- short * keep, * decoded;
- keep = decoded = new int16[new_size];
+ byte * keep, * decoded;
+ uint32 value;
+ keep = decoded = new byte[new_size * 2];
assert(keep);
unsigned char * source = _sbuffer;
- while(loop_size--) {
- int v1 = *source++;
- int v2 = *source++;
- int v3 = *source++;
- int value = (((v2 & 0x0f) << 12) | (v1 << 4)) - 0x8000;
- *decoded++ = (int16)value;
- value = (((v2 & 0xf0) << 8) | (v3 << 4)) - 0x8000;
- *decoded++ = (int16)value;
+ while(loop_size--) {
+ byte v1 = *source++;
+ byte v2 = *source++;
+ byte v3 = *source++;
+ value = ((((v2 & 0x0f) << 8) | v1) << 4) - 0x8000;
+ *decoded++ = (byte)((value >> 8) & 0xff);
+ *decoded++ = (byte)(value & 0xff);
+ value = ((((v2 & 0xf0) << 4) | v3) << 4) - 0x8000;
+ *decoded++ = (byte)((value >> 8) & 0xff);
+ *decoded++ = (byte)(value & 0xff);
}
delete []_sbuffer;
_sbuffer = (byte *)keep;
@@ -306,14 +321,25 @@
void ImuseChannel::getSoundData(int16 * snd, int32 size) {
if(_dataSize <= 0 || _bitsize <= 8) error("invalid call to imuse_channel::read_sound_data()");
if(_channels == 2) size *= 2;
+ byte * buf = (byte*)snd;
if(_rate == 11025) {
for(int32 i = 0; i < size; i++) {
- snd[i * 2] = READ_BE_UINT16(_sbuffer + 2 * i);
- snd[i * 2 + 1] = snd[i * 2];
+ byte sample1 = *(_sbuffer + i * 2);
+ byte sample2 = *(_sbuffer + i * 2 + 1);
+ uint16 sample = (uint16)(((int16)((sample1 << 8) | sample2) * _volume) >> 8);
+ buf[i * 4 + 0] = (byte)(sample >> 8);
+ buf[i * 4 + 1] = (byte)(sample & 0xff);
+ buf[i * 4 + 2] = buf[i * 4 + 0];
+ buf[i * 4 + 3] = buf[i * 4 + 1];
}
} else {
- for(int32 i = 0; i < size; i++)
- snd[i] = READ_BE_UINT16(_sbuffer + 2 * i);
+ for(int32 i = 0; i < size; i++){
+ byte sample1 = *(_sbuffer + i * 2);
+ byte sample2 = *(_sbuffer + i * 2 + 1);
+ uint16 sample = (uint16)(((int16)((sample1 << 8) | sample2) * _volume) >> 8);
+ buf[i * 2 + 0] = (byte)(sample >> 8);
+ buf[i * 2 + 1] = (byte)(sample & 0xff);
+ }
}
delete []_sbuffer;
assert(_sbufferSize == 2 * size);
@@ -327,12 +353,13 @@
if(_channels == 2) size *= 2;
if(_rate == 11025) {
for(int32 i = 0; i < size; i++) {
- snd[i * 2] = _sbuffer[i];
- snd[i * 2 + 1] = _sbuffer[i];
+ snd[i * 2] = (int8)(((int8)(_sbuffer[i] ^ 0x80) * _volume) >> 8) ^ 0x80;
+ snd[i * 2 + 1] = snd[i * 2];
}
} else {
- for(int32 i = 0; i < size; i++)
- snd[i] = _sbuffer[i];
+ for(int32 i = 0; i < size; i++){
+ snd[i] = (int8)(((int8)(_sbuffer[i] ^ 0x80) * _volume) >> 8) ^ 0x80;
+ }
}
delete []_sbuffer;
_sbuffer = 0;
Index: player.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/player.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- player.cpp 20 Sep 2002 05:46:03 -0000 1.14
+++ player.cpp 21 Sep 2002 09:21:50 -0000 1.15
@@ -291,28 +291,28 @@
debug(6, "SmushPlayer::handleFetch()");
}
-void SmushPlayer::handleImuseBuffer(int32 track_id, int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2, Chunk & b, int32 bsize) {
- _Channel * c = _mixer->findChannel(track_id);
+void SmushPlayer::handleImuseBuffer(int32 track_id, int32 index, int32 nbframes, int32 size, int32 unk1, int32 track_flags, Chunk & b, int32 bsize) {
+ int32 track = (track_flags << 16) | track_id;
+ _Channel * c = _mixer->findChannel(track);
if(c == 0) {
- c = new ImuseChannel(track_id, _soundFrequency);
+ c = new ImuseChannel(track, _soundFrequency);
_mixer->addChannel(c);
}
if(index == 0)
- c->setParameters(nbframes, size, unk1, unk2);
+ c->setParameters(nbframes, size, track_flags, unk1);
else
- c->checkParameters(index, nbframes, size, unk1, unk2);
+ c->checkParameters(index, nbframes, size, track_flags, unk1);
c->appendData(b, bsize);
}
-void SmushPlayer::handleImuseAction8(Chunk & b, int32 flags, int32 unknown, int32 track_id) {
+void SmushPlayer::handleImuseAction8(Chunk & b, int32 flags, int32 unknown, int32 track_flags) {
assert(flags == 46 && unknown == 0);
- int32 unknown2 = b.getWord();
- track_id |= unknown2 << 16;
+ int32 track_id = b.getWord();
int32 index = b.getWord();
int32 nbframes = b.getWord();
int32 size = b.getDword();
int32 bsize = b.getSize() - 18;
- handleImuseBuffer(track_id, index, nbframes, size, unknown, unknown2, b, bsize);
+ handleImuseBuffer(track_id, index, nbframes, size, unknown, track_flags, b, bsize);
}
void SmushPlayer::handleImuseAction(Chunk & b) {
@@ -322,17 +322,17 @@
int32 code = b.getWord();
int32 flags = b.getWord();
int32 unknown = b.getShort();
- int32 track_id = b.getWord();
+ int32 track_flags = b.getWord();
#ifdef DEBUG
- debug(5, "handleImuseAction(%d, %d, %d, %d)", code, flags, unknown, track_id);
+ debug(5, "handleImuseAction(%d, %d, %d, %d)", code, flags, unknown, track_flags);
#endif
switch(code) {
case 8:
- handleImuseAction8(b, flags, unknown, track_id);
+ handleImuseAction8(b, flags, unknown, track_flags);
break;
#ifdef DEBUG
default: {
- debug(9, "%5.5d %d %8.8d %4.4d", track_id, flags, unknown);
+ debug(9, "%5.5d %d %8.8d %4.4d", track_flags, flags, unknown);
}
#endif
}
More information about the Scummvm-git-logs
mailing list