aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorNicola Mettifogo2009-06-12 07:55:44 +0000
committerNicola Mettifogo2009-06-12 07:55:44 +0000
commit657e37985e79967b6fc3c51badb6fb669c6680dc (patch)
tree22c43af6440d8d9561bb3864651a3217fdf019ab /engines/parallaction
parentdf1534ffd058c4c75cbe549cd901bae4be1dad4b (diff)
downloadscummvm-rg350-657e37985e79967b6fc3c51badb6fb669c6680dc.tar.gz
scummvm-rg350-657e37985e79967b6fc3c51badb6fb669c6680dc.tar.bz2
scummvm-rg350-657e37985e79967b6fc3c51badb6fb669c6680dc.zip
Cleanup of sound code.
svn-id: r41461
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/disk_ns.cpp6
-rw-r--r--engines/parallaction/sound.h26
-rw-r--r--engines/parallaction/sound_br.cpp60
-rw-r--r--engines/parallaction/sound_ns.cpp46
4 files changed, 46 insertions, 92 deletions
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index a75decdf88..b002d1e1f5 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -29,12 +29,6 @@
#include "parallaction/parallaction.h"
-namespace Audio {
- class AudioStream;
-
- AudioStream *make8SVXStream(Common::ReadStream &input);
-}
-
namespace Parallaction {
diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h
index 8a5582b378..8fcfb94a9a 100644
--- a/engines/parallaction/sound.h
+++ b/engines/parallaction/sound.h
@@ -84,6 +84,14 @@ enum {
SC_PAUSE
};
+struct Channel {
+ Audio::AudioStream *stream;
+ Audio::SoundHandle handle;
+ uint32 volume;
+};
+
+
+
class SoundMan_ns : public SoundManImpl {
public:
enum {
@@ -148,13 +156,7 @@ class AmigaSoundMan_ns : public SoundMan_ns {
Audio::AudioStream *_musicStream;
Audio::SoundHandle _musicHandle;
- struct Channel {
- Audio::Voice8Header header;
- int8 *data;
- uint32 dataSize;
- bool dispose;
- Audio::SoundHandle handle;
- } _channels[NUM_SFX_CHANNELS];
+ Channel _channels[NUM_SFX_CHANNELS];
Audio::AudioStream *loadChannelData(const char *filename, Channel *ch, bool looping);
@@ -191,18 +193,12 @@ protected:
bool _musicEnabled;
bool _sfxEnabled;
+ Channel _channels[NUM_SFX_CHANNELS];
+
virtual void playMusic() = 0;
virtual void stopMusic() = 0;
virtual void pause(bool p) = 0;
- struct Channel {
- Audio::Voice8Header header;
- int8 *data;
- uint32 dataSize;
- bool dispose;
- Audio::SoundHandle handle;
- } _channels[NUM_SFX_CHANNELS];
-
public:
SoundMan_br(Parallaction_br *vm);
~SoundMan_br();
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 464201b2d6..c0e3f3b24a 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -404,25 +404,26 @@ DosSoundMan_br::~DosSoundMan_br() {
Audio::AudioStream *DosSoundMan_br::loadChannelData(const char *filename, Channel *ch, bool looping) {
Common::SeekableReadStream *stream = _vm->_disk->loadSound(filename);
- ch->dataSize = stream->size();
- ch->data = (int8*)malloc(ch->dataSize);
- if (stream->read(ch->data, ch->dataSize) != ch->dataSize)
+ uint32 dataSize = stream->size();
+ int8 *data = (int8*)malloc(dataSize);
+ if (stream->read(data, dataSize) != dataSize)
error("DosSoundMan_br::loadChannelData: Read failed");
- ch->dispose = true;
delete stream;
// TODO: Confirm sound rate
- ch->header.samplesPerSec = 11025;
+ int rate = 11025;
+
+ uint32 loopStart = 0, loopEnd = 0;
+ uint32 flags = Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_AUTOFREE;
- uint32 loopStart = 0, loopEnd = 0, flags = Audio::Mixer::FLAG_UNSIGNED;
if (looping) {
- loopEnd = ch->dataSize;
+ loopEnd = dataSize;
flags |= Audio::Mixer::FLAG_LOOP;
}
- // Create the input stream
- return Audio::makeLinearInputStream((byte *)ch->data, ch->dataSize, ch->header.samplesPerSec, flags, loopStart, loopEnd);
+ ch->stream = Audio::makeLinearInputStream((byte *)data, dataSize, rate, flags, loopStart, loopEnd);
+ return ch->stream;
}
void DosSoundMan_br::playSfx(const char *filename, uint channel, bool looping, int volume) {
@@ -474,26 +475,21 @@ Audio::AudioStream *AmigaSoundMan_br::loadChannelData(const char *filename, Chan
Audio::AudioStream *input = 0;
if (_vm->getFeatures() & GF_DEMO) {
- ch->dataSize = stream->size();
- ch->data = (int8*)malloc(ch->dataSize);
- if (stream->read(ch->data, ch->dataSize) != ch->dataSize)
+ uint32 dataSize = stream->size();
+ int8 *data = (int8*)malloc(dataSize);
+ if (stream->read(data, dataSize) != dataSize)
error("DosSoundMan_br::loadChannelData: Read failed");
// TODO: Confirm sound rate
- ch->header.samplesPerSec = 11025;
-
- uint32 loopStart = 0, loopEnd = 0, flags = 0;
- if (looping) {
- loopEnd = ch->header.oneShotHiSamples + ch->header.repeatHiSamples;
- flags = Audio::Mixer::FLAG_LOOP;
- }
-
- input = Audio::makeLinearInputStream((byte *)ch->data, ch->dataSize, ch->header.samplesPerSec, flags, loopStart, loopEnd);
+ int rate = 11025;
+ input = Audio::makeLinearInputStream((byte *)data, dataSize, rate, Audio::Mixer::FLAG_AUTOFREE, 0, 0);
} else {
input = Audio::make8SVXStream(*stream, looping);
- delete stream;
}
+ delete stream;
+
+ ch->stream = input;
return input;
}
@@ -515,7 +511,7 @@ void AmigaSoundMan_br::playSfx(const char *filename, uint channel, bool looping,
Audio::AudioStream *input = loadChannelData(filename, ch, looping);
if (volume == -1) {
- volume = ch->header.volume;
+ volume = ch->volume;
}
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &ch->handle, input, -1, volume);
@@ -560,15 +556,6 @@ void AmigaSoundMan_br::pause(bool p) {
SoundMan_br::SoundMan_br(Parallaction_br *vm) : _vm(vm) {
_mixer = _vm->_mixer;
- _channels[0].data = 0;
- _channels[0].dispose = false;
- _channels[1].data = 0;
- _channels[1].dispose = false;
- _channels[2].data = 0;
- _channels[2].dispose = false;
- _channels[3].data = 0;
- _channels[3].dispose = false;
-
_musicEnabled = true;
_sfxEnabled = true;
}
@@ -595,12 +582,9 @@ void SoundMan_br::stopSfx(uint channel) {
return;
}
- if (_channels[channel].dispose) {
- debugC(1, kDebugAudio, "SoundMan_br::stopSfx(%i)", channel);
- _mixer->stopHandle(_channels[channel].handle);
- free(_channels[channel].data);
- _channels[channel].data = 0;
- }
+ debugC(1, kDebugAudio, "SoundMan_br::stopSfx(%i)", channel);
+ _mixer->stopHandle(_channels[channel].handle);
+ _channels[channel].stream = 0;
}
void SoundMan_br::execute(int command, const char *parm) {
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index b5ce54c78d..65ee75ed98 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -335,14 +335,6 @@ void DosSoundMan_ns::playLocationMusic(const char *location) {
AmigaSoundMan_ns::AmigaSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm) {
_musicStream = 0;
- _channels[0].data = 0;
- _channels[0].dispose = false;
- _channels[1].data = 0;
- _channels[1].dispose = false;
- _channels[2].data = 0;
- _channels[2].dispose = false;
- _channels[3].data = 0;
- _channels[3].dispose = false;
}
AmigaSoundMan_ns::~AmigaSoundMan_ns() {
@@ -364,34 +356,25 @@ Audio::AudioStream *AmigaSoundMan_ns::loadChannelData(const char *filename, Chan
Audio::AudioStream *input = 0;
if (!scumm_stricmp("beep", filename)) {
- ch->header.oneShotHiSamples = 0;
- ch->header.repeatHiSamples = 0;
- ch->header.samplesPerHiCycle = 0;
- ch->header.samplesPerSec = 11934;
- ch->header.volume = 160;
- ch->data = (int8*)malloc(AMIGABEEP_SIZE * NUM_REPEATS);
- int8* odata = ch->data;
+ // TODO: make a permanent stream out of this
+ uint32 dataSize = AMIGABEEP_SIZE * NUM_REPEATS;
+ int8 *data = (int8*)malloc(dataSize);
+ int8 *odata = data;
for (uint i = 0; i < NUM_REPEATS; i++) {
memcpy(odata, res_amigaBeep, AMIGABEEP_SIZE);
odata += AMIGABEEP_SIZE;
}
- ch->dataSize = AMIGABEEP_SIZE * NUM_REPEATS;
- ch->dispose = true;
-
- uint32 loopStart = 0, loopEnd = 0, flags = 0;
- if (looping) {
- loopEnd = ch->header.oneShotHiSamples + ch->header.repeatHiSamples;
- flags = Audio::Mixer::FLAG_LOOP;
- }
-
- input = Audio::makeLinearInputStream((byte *)ch->data, ch->dataSize, ch->header.samplesPerSec, flags, loopStart, loopEnd);
+ int rate = 11934;
+ ch->volume = 160;
+ input = Audio::makeLinearInputStream((byte *)data, dataSize, rate, Audio::Mixer::FLAG_AUTOFREE, 0, 0);
} else {
Common::SeekableReadStream *stream = _vm->_disk->loadSound(filename);
input = Audio::make8SVXStream(*stream, looping);
- ch->dispose = true;
delete stream;
}
+ ch->stream = input;
+
return input;
}
@@ -409,7 +392,7 @@ void AmigaSoundMan_ns::playSfx(const char *filename, uint channel, bool looping,
Audio::AudioStream *input = loadChannelData(filename, ch, looping);
if (volume == -1) {
- volume = ch->header.volume;
+ volume = ch->volume;
}
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &ch->handle, input, -1, volume);
@@ -421,12 +404,9 @@ void AmigaSoundMan_ns::stopSfx(uint channel) {
return;
}
- if (_channels[channel].dispose) {
- debugC(1, kDebugAudio, "AmigaSoundMan_ns::stopSfx(%i)", channel);
- _mixer->stopHandle(_channels[channel].handle);
- free(_channels[channel].data);
- _channels[channel].data = 0;
- }
+ debugC(1, kDebugAudio, "AmigaSoundMan_ns::stopSfx(%i)", channel);
+ _mixer->stopHandle(_channels[channel].handle);
+ _channels[channel].stream = 0;
}
void AmigaSoundMan_ns::playMusic() {