diff options
Diffstat (limited to 'sound/mods')
-rw-r--r-- | sound/mods/infogrames.cpp | 7 | ||||
-rw-r--r-- | sound/mods/module.cpp | 5 | ||||
-rw-r--r-- | sound/mods/module.h | 5 | ||||
-rw-r--r-- | sound/mods/paula.cpp | 16 | ||||
-rw-r--r-- | sound/mods/paula.h | 22 | ||||
-rw-r--r-- | sound/mods/protracker.cpp | 10 |
6 files changed, 38 insertions, 27 deletions
diff --git a/sound/mods/infogrames.cpp b/sound/mods/infogrames.cpp index e5eda6e838..a1eeddf22d 100644 --- a/sound/mods/infogrames.cpp +++ b/sound/mods/infogrames.cpp @@ -236,8 +236,7 @@ bool Infogrames::load(Common::SeekableReadStream &dum) { void Infogrames::unload(void) { stopPlay(); - if (_data) - delete[] _data; + delete[] _data; _data = 0; clearVoices(); @@ -449,9 +448,9 @@ void Infogrames::interrupt() { } else if (_repCount != -1) { _end = true; _playing = false; - } - else + } else { init(); + } } } diff --git a/sound/mods/module.cpp b/sound/mods/module.cpp index 291f95fe3f..d6f1d3eb4d 100644 --- a/sound/mods/module.cpp +++ b/sound/mods/module.cpp @@ -33,6 +33,11 @@ bool Module::load(Common::ReadStream &st) { st.read(songname, 20); songname[20] = '\0'; + // FIXME: We define sample to have 32 entries, + // yet we only setup 31 of these -- is this on + // purpose, or an off-by-one error? This should + // be clarified by either adding a comment explaining + // this odditiy, or by fixing the off-by-one-bug. for (int i = 0; i < 31; ++i) { st.read(sample[i].name, 22); sample[i].name[22] = '\0'; diff --git a/sound/mods/module.h b/sound/mods/module.h index 1e87b7e1ea..f56e42767b 100644 --- a/sound/mods/module.h +++ b/sound/mods/module.h @@ -29,6 +29,11 @@ namespace Modules { /* + * FIXME: Is the following comment still valid? If so, + * it should be marked accordingly, and maybe added to our + * TODO list on the Wiki (conserving memory is always a big + * boon for our smaller targets). + * * Storing notes and patterns like this * wastes insane amounts of memory. * diff --git a/sound/mods/paula.cpp b/sound/mods/paula.cpp index 90d247096c..33a8dd7c2a 100644 --- a/sound/mods/paula.cpp +++ b/sound/mods/paula.cpp @@ -45,8 +45,7 @@ Paula::~Paula() { } void Paula::clearVoice(byte voice) { - if (voice >= 4) - return; + assert(voice < NUM_VOICES); _voice[voice].data = 0; _voice[voice].dataRepeat = 0; @@ -68,12 +67,14 @@ int Paula::readBuffer(int16 *buffer, const int numSamples) { int16 *p; int8 *data; - _mutex.lock(); +// FIXME: Could this code be unified/merged with ProtrackerStream::generateSound? +// They look very similar. Maybe one could be rewritten to +// use the other? + + Common::StackLock lock(_mutex); memset(buffer, 0, numSamples * 2); - if (!_playing) - { - _mutex.unlock(); + if (!_playing) { return numSamples; } @@ -84,7 +85,7 @@ int Paula::readBuffer(int16 *buffer, const int numSamples) { _curInt = 0; } nSamples = MIN(samples, _intFreq - _curInt); - for (voice = 0; voice < 4; voice++) { + for (voice = 0; voice < NUM_VOICES; voice++) { if (!_voice[voice].data || (_voice[voice].period <= 0)) continue; @@ -160,7 +161,6 @@ int Paula::readBuffer(int16 *buffer, const int numSamples) { _curInt += nSamples; samples -= nSamples; } - _mutex.unlock(); return numSamples; } diff --git a/sound/mods/paula.h b/sound/mods/paula.h index be85122635..aebc5a9bbb 100644 --- a/sound/mods/paula.h +++ b/sound/mods/paula.h @@ -35,18 +35,19 @@ namespace Audio { */ class Paula : public AudioStream { public: + static const int NUM_VOICES = 4; + Paula(bool stereo = false, int rate = 44100, int interruptFreq = 0); ~Paula(); bool playing() const { return _playing; } void setInterruptFreq(int freq) { _intFreq = freq; } - void setPanning(byte voice, byte panning) - { - if (voice < 4) - _voice[voice].panning = panning; + void setPanning(byte voice, byte panning) { + assert(voice < NUM_VOICES); + _voice[voice].panning = panning; } void clearVoice(byte voice); - void clearVoices() { int i; for (i = 0; i < 4; i++) clearVoice(i); } + void clearVoices() { for (int i = 0; i < NUM_VOICES; ++i) clearVoice(i); } virtual void startPlay(void) {} virtual void stopPlay(void) {} virtual void pausePlay(bool pause) {} @@ -67,7 +68,7 @@ protected: byte volume; double offset; byte panning; // For stereo mixing: 0 = far left, 255 = far right - } _voice[4]; + } _voice[NUM_VOICES]; int _rate; int _intFreq; @@ -78,13 +79,12 @@ protected: Common::Mutex _mutex; void mix(int16 *&buf, int8 data, int voice) { + const int32 tmp = ((int32) data) * _voice[voice].volume; if (_stereo) { - *buf++ += (((int32) data) * _voice[voice].volume * - (255 - _voice[voice].panning)) >> 7; - *buf++ += (((int32) data) * _voice[voice].volume * - (_voice[voice].panning)) >> 7; + *buf++ += (tmp * (255 - _voice[voice].panning)) >> 7; + *buf++ += (tmp * (_voice[voice].panning)) >> 7; } else - *buf++ += _voice[voice].volume * data; + *buf++ += tmp; } virtual void interrupt(void) {}; }; diff --git a/sound/mods/protracker.cpp b/sound/mods/protracker.cpp index ab3776624b..83fb1790cf 100644 --- a/sound/mods/protracker.cpp +++ b/sound/mods/protracker.cpp @@ -179,9 +179,12 @@ void ProtrackerStream::generateSound() { _buf->ensureCapacity(samples); +// FIXME: Could this code be unified/ with Paula::readBuffer? +// They look very similar. Maybe one could be rewritten to +// use the other? + int16 *p = _buf->getEnd(); - for (int i = 0; i < samples; i++) - p[i] = 0; + memset(p, 0, samples * sizeof(int16)); for (int track = 0; track < 4; track++) { if (_track[track].sample > 0) { @@ -234,8 +237,7 @@ void ProtrackerStream::generateSound() { } } else { if (offset < slen) { - if ((int)(offset + samples * rate) >= - slen) { + if ((int)(offset + samples * rate) >= slen) { /* The end of the sample is the limiting factor */ int end = (int)((slen - offset) / rate); |