aboutsummaryrefslogtreecommitdiff
path: root/scumm/smush
diff options
context:
space:
mode:
authorPaweł Kołodziejski2004-01-09 23:33:46 +0000
committerPaweł Kołodziejski2004-01-09 23:33:46 +0000
commit1f04d5a7cdddb06b6e28ddc6938b15424f210528 (patch)
treea27fe2f412e837ba28f8cc2649e45cd5e06e64d2 /scumm/smush
parent9d7d23a7c6c938b9b205d7237ed21433a38a5914 (diff)
downloadscummvm-rg350-1f04d5a7cdddb06b6e28ddc6938b15424f210528.tar.gz
scummvm-rg350-1f04d5a7cdddb06b6e28ddc6938b15424f210528.tar.bz2
scummvm-rg350-1f04d5a7cdddb06b6e28ddc6938b15424f210528.zip
handle volume and pan by SoundMixer not SmushMixer
svn-id: r12287
Diffstat (limited to 'scumm/smush')
-rw-r--r--scumm/smush/channel.h15
-rw-r--r--scumm/smush/imuse_channel.cpp16
-rw-r--r--scumm/smush/saud_channel.cpp43
-rw-r--r--scumm/smush/smush_mixer.cpp6
-rw-r--r--scumm/smush/smush_player.cpp14
5 files changed, 32 insertions, 62 deletions
diff --git a/scumm/smush/channel.h b/scumm/smush/channel.h
index 81e23c45ab..2de1c38a54 100644
--- a/scumm/smush/channel.h
+++ b/scumm/smush/channel.h
@@ -41,7 +41,7 @@ public:
virtual void getSoundData(int16 *sound_buffer, int32 size) = 0;
virtual void getSoundData(int8 *sound_buffer, int32 size) = 0;
virtual int32 getRate() = 0;
- virtual bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) = 0;
+ virtual bool getParameters(int32 &rate, bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) = 0;
virtual int32 getTrackIdentifier() const = 0;
};
@@ -55,9 +55,8 @@ private:
bool _markReached;
int32 _flags;
int32 _volume;
- int32 _balance;
+ int32 _pan;
int32 _index;
- int16 _voltable[2][256];
byte *_tbuffer;
int32 _tbufferSize;
byte *_sbuffer;
@@ -70,7 +69,6 @@ protected:
void handleShdr(Chunk &c);
bool handleSubTags(int32 &offset);
bool processBuffer();
- void recalcVolumeTable();
public:
SaudChannel(int32 track, int32 freq);
@@ -83,10 +81,12 @@ public:
void getSoundData(int16 *sound_buffer, int32 size);
void getSoundData(int8 *sound_buffer, int32 size) { error("8bit request for SAUD channel should never happen"); };
int32 getRate() { return _frequency; }
- bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {
+ bool getParameters(int32 &rate, bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) {
rate = _frequency;
stereo = true;
is_16bit = true;
+ vol = _volume;
+ pan = _pan;
return true;
};
virtual int32 getTrackIdentifier() const { return _track; };
@@ -104,6 +104,7 @@ private:
int32 _dataSize; //!< remaining size of sound data in the iMUS buffer
bool _inData;
int32 _volume;
+ int32 _pan;
int32 _bitsize; //!< the bitsize of the original data
int32 _rate; //!< the sampling rate of the original data
@@ -131,10 +132,12 @@ public:
void getSoundData(int16 *sound_buffer, int32 size);
void getSoundData(int8 *sound_buffer, int32 size);
int32 getRate() { return _rate; }
- bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {
+ bool getParameters(int32 &rate, bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) {
rate = _rate;
stereo = (_channels == 2);
is_16bit = (_bitsize > 8);
+ vol = _volume;
+ pan = _pan;
return true;
};
virtual int32 getTrackIdentifier() const { return _track; };
diff --git a/scumm/smush/imuse_channel.cpp b/scumm/smush/imuse_channel.cpp
index 186e86ea20..bf00a66571 100644
--- a/scumm/smush/imuse_channel.cpp
+++ b/scumm/smush/imuse_channel.cpp
@@ -63,6 +63,7 @@ bool ImuseChannel::setParameters(int32 nb, int32 size, int32 flags, int32 unk1,
} else {
error("ImuseChannel::setParameters(): bad flags: %d", flags);
}
+ _pan = 0;
return true;
}
@@ -324,15 +325,9 @@ int32 ImuseChannel::availableSoundData(void) const {
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;
- 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);
- }
+ memcpy(snd, _sbuffer, size * 2);
+
delete []_sbuffer;
assert(_sbufferSize == 2 * size);
_sbuffer = 0;
@@ -344,9 +339,8 @@ void ImuseChannel::getSoundData(int8 *snd, int32 size) {
if (_dataSize <= 0 || _bitsize > 8) error("invalid call to imuse_channel::read_sound_data()");
if (_channels == 2) size *= 2;
- for (int32 i = 0; i < size; i++){
- snd[i] = (int8)(((int8)(_sbuffer[i] ^ 0x80) * _volume) >> 8) ^ 0x80;
- }
+ memcpy(snd, _sbuffer, size);
+
delete []_sbuffer;
_sbuffer = 0;
_sbufferSize = 0;
diff --git a/scumm/smush/saud_channel.cpp b/scumm/smush/saud_channel.cpp
index 69d607b36d..a8c6fc9570 100644
--- a/scumm/smush/saud_channel.cpp
+++ b/scumm/smush/saud_channel.cpp
@@ -183,59 +183,30 @@ bool SaudChannel::isTerminated() const {
return (_markReached && _dataSize == 0 && _sbuffer == 0);
}
-void SaudChannel::recalcVolumeTable() {
- const int MAX_BALANCE = 100;
- int volume_left, volume_right;
- if (_balance < -MAX_BALANCE || _balance > MAX_BALANCE) {
- warning("balance is out of range ! : %d", _balance);
- return;
- }
- int left_multiplier = MAX_BALANCE - _balance;
- int right_multiplier = MAX_BALANCE + _balance;
- volume_left = _volume * left_multiplier / (MAX_BALANCE * 2);
- volume_right = _volume * right_multiplier / (MAX_BALANCE * 2);
- if (volume_left < 0)
- volume_left = 0;
- if (volume_left > 128)
- volume_left = 128;
- if (volume_right < 0)
- volume_right = 0;
- if (volume_right > 128)
- volume_right = 128;
- for (int i = 0; i < 256; i++) {
- int16 value = volume_left * (int8)i;
- _voltable[0][i] = TO_BE_16(value);
- value = volume_right * (int8)i;
- _voltable[1][i] = TO_BE_16(value);
- }
-}
-
-bool SaudChannel::setParameters(int32 nb, int32 flags, int32 volume, int32 balance, int32 index) {
+bool SaudChannel::setParameters(int32 nb, int32 flags, int32 volume, int32 pan, int32 index) {
_nbframes = nb;
_flags = flags; // bit 7 == IS_VOICE, bit 6 == IS_BACKGROUND_MUSIC, other ??
_volume = volume;
- _balance = balance;
+ _pan = pan;
_index = index;
if (index != 0) {
_dataSize = -2;
_keepSize = true;
_inData = true;
}
- recalcVolumeTable();
return true;
}
-bool SaudChannel::checkParameters(int32 index, int32 nb, int32 flags, int32 volume, int32 balance) {
+bool SaudChannel::checkParameters(int32 index, int32 nb, int32 flags, int32 volume, int32 pan) {
if (++_index != index)
error("invalid index in SaudChannel::checkParameters()");
if (_nbframes != nb)
error("invalid duration in SaudChannel::checkParameters()");
if (_flags != flags)
error("invalid flags in SaudChannel::checkParameters()");
- if (_volume != volume || _balance != balance) {
+ if (_volume != volume || _pan != pan) {
_volume = volume;
- _balance = balance;
- recalcVolumeTable();
+ _pan = pan;
}
return true;
}
@@ -277,8 +248,8 @@ int32 SaudChannel::availableSoundData(void) const {
void SaudChannel::getSoundData(int16 *snd, int32 size) {
for (int32 i = 0; i < size; i++) {
- snd[2 * i] = _voltable[0][_sbuffer[i] ^ 0x80];
- snd[2 * i + 1] = _voltable[1][_sbuffer[i] ^ 0x80];
+ snd[2 * i] = _sbuffer[i] ^ 0x80;
+ snd[2 * i + 1] = _sbuffer[i] ^ 0x80;
}
if (!_keepSize)
_dataSize -= size;
diff --git a/scumm/smush/smush_mixer.cpp b/scumm/smush/smush_mixer.cpp
index bdb72e84b3..7f8ee10722 100644
--- a/scumm/smush/smush_mixer.cpp
+++ b/scumm/smush/smush_mixer.cpp
@@ -95,11 +95,11 @@ bool SmushMixer::handleFrame() {
_channels[i].chan = NULL;
_mixer->endStream(_channels[i].handle);
} else {
- int32 rate;
+ int32 rate, vol, pan;
bool stereo, is_16bit;
void *data;
- _channels[i].chan->getParameters(rate, stereo, is_16bit);
+ _channels[i].chan->getParameters(rate, stereo, is_16bit, vol, pan);
int32 size = _channels[i].chan->availableSoundData();
byte flags = stereo ? SoundMixer::FLAG_STEREO : 0;
@@ -121,6 +121,8 @@ bool SmushMixer::handleFrame() {
if (_mixer->isReady()) {
if (!_channels[i].handle.isActive())
_mixer->newStream(&_channels[i].handle, rate, flags, 400000);
+ _mixer->setChannelVolume(_channels[i].handle, vol);
+ _mixer->setChannelPan(_channels[i].handle, pan);
_mixer->appendStream(_channels[i].handle, data, size);
}
free(data);
diff --git a/scumm/smush/smush_player.cpp b/scumm/smush/smush_player.cpp
index 6eb5a29f35..a7bfd6058b 100644
--- a/scumm/smush/smush_player.cpp
+++ b/scumm/smush/smush_player.cpp
@@ -298,7 +298,7 @@ void SmushPlayer::checkBlock(const Chunk &b, Chunk::type type_expected, uint32 m
}
}
-void SmushPlayer::handleSoundBuffer(int32 track_id, int32 index, int32 max_frames, int32 flags, int32 vol, int32 bal, Chunk &b, int32 size) {
+void SmushPlayer::handleSoundBuffer(int32 track_id, int32 index, int32 max_frames, int32 flags, int32 vol, int32 pan, Chunk &b, int32 size) {
debug(6, "SmushPlayer::handleSoundBuffer(%d, %d)", track_id, index);
// if ((flags & 128) == 128) {
// return;
@@ -313,11 +313,11 @@ void SmushPlayer::handleSoundBuffer(int32 track_id, int32 index, int32 max_frame
}
if ((_middleAudio) && (index != 0)) {
- c->setParameters(max_frames, flags, vol, bal, index);
+ c->setParameters(max_frames, flags, vol, pan, index);
} else if (index == 0) {
- c->setParameters(max_frames, flags, vol, bal, index);
+ c->setParameters(max_frames, flags, vol, pan, index);
} else {
- c->checkParameters(index, max_frames, flags, vol, bal);
+ c->checkParameters(index, max_frames, flags, vol, pan);
}
_middleAudio = false;
c->appendData(b, size);
@@ -332,12 +332,12 @@ void SmushPlayer::handleSoundFrame(Chunk &b) {
int32 max_frames = b.getWord();
int32 flags = b.getWord();
int32 vol = b.getByte();
- int32 bal = b.getChar();
+ int32 pan = b.getChar();
if (index == 0) {
- debug(5, "track_id == %d, max_frames == %d, %d, %d, %d", track_id, max_frames, flags, vol, bal);
+ debug(5, "track_id:%d, max_frames:%d, flags:%d, vol:%d, pan:%d", track_id, max_frames, flags, vol, pan);
}
int32 size = b.getSize() - 10;
- handleSoundBuffer(track_id, index, max_frames, flags, vol, bal, b, size);
+ handleSoundBuffer(track_id, index, max_frames, flags, vol, pan, b, size);
}
void SmushPlayer::handleSkip(Chunk &b) {