Skip to content

Commit

Permalink
Merge pull request #129 from fingolfin/dreamweb-sound
Browse files Browse the repository at this point in the history
DREAMWEB: Move sound related code to a new source file
  • Loading branch information
bluegr committed Dec 8, 2011
2 parents 7d3c622 + 45a99e7 commit 02fed99
Show file tree
Hide file tree
Showing 6 changed files with 313 additions and 275 deletions.
7 changes: 6 additions & 1 deletion engines/dreamweb/dreambase.h
Expand Up @@ -69,13 +69,18 @@ class DreamBase {
uint8 getNumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset);
uint8 kernChars(uint8 firstChar, uint8 secondChar, uint8 width);

// from sound.cpp
void volumeAdjust();
void cancelCh0();
void cancelCh1();
void loadRoomsSample();

// from stubs.cpp
void crosshair();
void showBlink();
void dumpBlink();
void dumpPointer();
void showRyanPage();
void volumeAdjust();

// from vgagrafx.cpp
uint8 _workspace[(0x1000 + 2) * 16];
Expand Down
167 changes: 0 additions & 167 deletions engines/dreamweb/dreamweb.cpp
Expand Up @@ -30,9 +30,6 @@
#include "common/timer.h"
#include "common/util.h"

#include "audio/mixer.h"
#include "audio/decoders/raw.h"

#include "graphics/palette.h"
#include "graphics/surface.h"

Expand Down Expand Up @@ -377,170 +374,6 @@ void DreamWebEngine::cls() {
_system->fillScreen(0);
}

void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) {
debug(1, "playSound(%u, %u, %u)", channel, id, loops);

int bank = 0;
bool speech = false;
Audio::Mixer::SoundType type = channel == 0?
Audio::Mixer::kMusicSoundType: Audio::Mixer::kSFXSoundType;

if (id >= 12) {
id -= 12;
bank = 1;
if (id == 50) {
speech = true;
type = Audio::Mixer::kSpeechSoundType;
}
}
const SoundData &data = _soundData[bank];

Audio::SeekableAudioStream *raw;
if (!speech) {
if (id >= data.samples.size() || data.samples[id].size == 0) {
warning("invalid sample #%u played", id);
return;
}

const Sample &sample = data.samples[id];
uint8 *buffer = (uint8 *)malloc(sample.size);
if (!buffer)
error("out of memory: cannot allocate memory for sound(%u bytes)", sample.size);
memcpy(buffer, data.data.begin() + sample.offset, sample.size);

raw = Audio::makeRawStream(
buffer,
sample.size, 22050, Audio::FLAG_UNSIGNED);
} else {
uint8 *buffer = (uint8 *)malloc(_speechData.size());
if (!buffer)
error("out of memory: cannot allocate memory for sound(%u bytes)", _speechData.size());
memcpy(buffer, _speechData.begin(), _speechData.size());
raw = Audio::makeRawStream(
buffer,
_speechData.size(), 22050, Audio::FLAG_UNSIGNED);

}

Audio::AudioStream *stream;
if (loops > 1) {
stream = new Audio::LoopingAudioStream(raw, loops < 255? loops: 0);
} else
stream = raw;

if (_mixer->isSoundHandleActive(_channelHandle[channel]))
_mixer->stopHandle(_channelHandle[channel]);
_mixer->playStream(type, &_channelHandle[channel], stream);
}

void DreamWebEngine::stopSound(uint8 channel) {
debug(1, "stopSound(%u)", channel);
assert(channel == 0 || channel == 1);
_mixer->stopHandle(_channelHandle[channel]);
if (channel == 0)
_channel0 = 0;
else
_channel1 = 0;
}

bool DreamWebEngine::loadSpeech(const Common::String &filename) {
if (ConfMan.getBool("speech_mute"))
return false;

Common::File file;
if (!file.open("speech/" + filename))
return false;

debug(1, "loadSpeech(%s)", filename.c_str());

uint size = file.size();
_speechData.resize(size);
file.read(_speechData.begin(), size);
file.close();
return true;
}

void DreamWebEngine::soundHandler() {
_base.data.byte(DreamGen::kSubtitles) = ConfMan.getBool("subtitles");
_base.volumeAdjust();

uint volume = _base.data.byte(DreamGen::kVolume);
//.vol file loaded into soundbuf:0x4000
//volume table at (volume * 0x100 + 0x3f00)
//volume value could be from 1 to 7
//1 - 0x10-0xff
//2 - 0x1f-0xdf
//3 - 0x2f-0xd0
//4 - 0x3e-0xc1
//5 - 0x4d-0xb2
//6 - 0x5d-0xa2
//7 - 0x6f-0x91
if (volume >= 8)
volume = 7;
volume = (8 - volume) * Audio::Mixer::kMaxChannelVolume / 8;
_mixer->setChannelVolume(_channelHandle[0], volume);

uint8 ch0 = _base.data.byte(DreamGen::kCh0playing);
if (ch0 == 255)
ch0 = 0;
uint8 ch1 = _base.data.byte(DreamGen::kCh1playing);
if (ch1 == 255)
ch1 = 0;
uint8 ch0loop = _base.data.byte(DreamGen::kCh0repeat);

if (_channel0 != ch0) {
_channel0 = ch0;
if (ch0) {
playSound(0, ch0, ch0loop);
}
}
if (_channel1 != ch1) {
_channel1 = ch1;
if (ch1) {
playSound(1, ch1, 1);
}
}
if (!_mixer->isSoundHandleActive(_channelHandle[0])) {
_base.data.byte(DreamGen::kCh0playing) = 255;
_channel0 = 0;
}
if (!_mixer->isSoundHandleActive(_channelHandle[1])) {
_base.data.byte(DreamGen::kCh1playing) = 255;
_channel1 = 0;
}

}

void DreamWebEngine::loadSounds(uint bank, const Common::String &filename) {
debug(1, "loadSounds(%u, %s)", bank, filename.c_str());
Common::File file;
if (!file.open(filename)) {
warning("cannot open %s", filename.c_str());
return;
}

uint8 header[0x60];
file.read(header, sizeof(header));
uint tablesize = READ_LE_UINT16(header + 0x32);
debug(1, "table size = %u", tablesize);

SoundData &soundData = _soundData[bank];
soundData.samples.resize(tablesize / 6);
uint total = 0;
for(uint i = 0; i < tablesize / 6; ++i) {
uint8 entry[6];
Sample &sample = soundData.samples[i];
file.read(entry, sizeof(entry));
sample.offset = entry[0] * 0x4000 + READ_LE_UINT16(entry + 1);
sample.size = READ_LE_UINT16(entry + 3) * 0x800;
total += sample.size;
debug(1, "offset: %08x, size: %u", sample.offset, sample.size);
}
soundData.data.resize(total);
file.read(soundData.data.begin(), total);
file.close();
}

uint8 DreamWebEngine::modifyChar(uint8 c) const {
if (c < 128)
return c;
Expand Down
1 change: 1 addition & 0 deletions engines/dreamweb/module.mk
Expand Up @@ -13,6 +13,7 @@ MODULE_OBJS := \
people.o \
print.o \
saveload.o \
sound.o \
sprite.o \
stubs.o \
talk.o \
Expand Down

0 comments on commit 02fed99

Please sign in to comment.