[Scummvm-git-logs] scummvm master -> 413c85e3f8c526b30248e3f5e4cc33b2f6dbe953
OMGPizzaGuy
noreply at scummvm.org
Wed Jan 24 00:48:34 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
413c85e3f8 ULTIMA8: Move audio stream creation to the audio sample classes.
Commit: 413c85e3f8c526b30248e3f5e4cc33b2f6dbe953
https://github.com/scummvm/scummvm/commit/413c85e3f8c526b30248e3f5e4cc33b2f6dbe953
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2024-01-23T18:48:16-06:00
Commit Message:
ULTIMA8: Move audio stream creation to the audio sample classes.
This greatly simplifies RawAudioSample and allows further potential clean up for Sonarc audio
Changed paths:
engines/ultima/ultima8/audio/audio_channel.cpp
engines/ultima/ultima8/audio/audio_channel.h
engines/ultima/ultima8/audio/audio_sample.cpp
engines/ultima/ultima8/audio/audio_sample.h
engines/ultima/ultima8/audio/raw_audio_sample.cpp
engines/ultima/ultima8/audio/raw_audio_sample.h
engines/ultima/ultima8/audio/sonarc_audio_sample.cpp
engines/ultima/ultima8/audio/sonarc_audio_sample.h
diff --git a/engines/ultima/ultima8/audio/audio_channel.cpp b/engines/ultima/ultima8/audio/audio_channel.cpp
index f83aab6ca1a..b7ad2f55b8f 100644
--- a/engines/ultima/ultima8/audio/audio_channel.cpp
+++ b/engines/ultima/ultima8/audio/audio_channel.cpp
@@ -32,8 +32,8 @@ namespace Ultima8 {
AudioChannel::AudioChannel(Audio::Mixer *mixer, uint32 sampleRate, bool stereo) :
- _mixer(mixer), _decompressorSize(0), _frameSize(0), _loop(0), _sample(nullptr),
- _frameEvenOdd(0), _paused(false), _priority(0), _lVol(0), _rVol(0), _pitchShift(0) {
+ _mixer(mixer), _loop(0), _sample(nullptr),
+ _paused(false), _priority(0), _lVol(0), _rVol(0), _pitchShift(0) {
}
AudioChannel::~AudioChannel(void) {
@@ -51,35 +51,8 @@ void AudioChannel::playSample(AudioSample *sample, int loop, int priority, bool
if (!_sample)
return;
- // Setup buffers
- _decompressorSize = _sample->getDecompressorDataSize();
- _frameSize = _sample->getFrameSize();
-
- if ((_decompressorSize + _frameSize * 2) > _playData.size()) {
- _playData.resize(_decompressorSize + _frameSize * 2);
- }
-
- // Init the _sample decompressor
- _sample->initDecompressor(&_playData[0]);
-
- // Reset counter and stuff
- _frameEvenOdd = 0;
-
- // Get the data for the _sample
- Common::MemoryWriteStreamDynamic streamData(DisposeAfterUse::NO);
- int frameSize;
- byte *framePtr = &_playData[_decompressorSize];
-
- while ((frameSize = _sample->decompressFrame(&_playData[0], framePtr)) != 0)
- streamData.write(framePtr, frameSize);
-
// Create the _sample
- Audio::SeekableAudioStream *audioStream = Audio::makeRawStream(
- new Common::MemoryReadStream(streamData.getData(), streamData.size(), DisposeAfterUse::YES),
- _sample->getRate(),
- _sample->isStereo() ? Audio::FLAG_STEREO | Audio::FLAG_UNSIGNED : Audio::FLAG_UNSIGNED,
- DisposeAfterUse::YES
- );
+ Audio::SeekableAudioStream *audioStream = _sample->makeStream();
int loops = _loop;
if (loops == -1) {
diff --git a/engines/ultima/ultima8/audio/audio_channel.h b/engines/ultima/ultima8/audio/audio_channel.h
index 32ca3dde83c..a3f5dd65835 100644
--- a/engines/ultima/ultima8/audio/audio_channel.h
+++ b/engines/ultima/ultima8/audio/audio_channel.h
@@ -31,21 +31,13 @@ class AudioSample;
class AudioChannel {
private:
- // We have:
- // 1x decompressor size
- // 2x frame size
- Common::Array<byte> _playData;
-
Audio::SoundHandle _soundHandle;
Audio::Mixer *_mixer;
- uint32 _decompressorSize; // Persistent data for the decompressor
- uint32 _frameSize; //
int32 _loop;
AudioSample *_sample;
// Info for sampling
- uint32 _frameEvenOdd; // which buffer is 'frame0'
int _lVol, _rVol; // 0-256
uint32 _pitchShift; // AudioProcess::PITCH_SHIFT_NONE = no shift
int _priority; // anything.
diff --git a/engines/ultima/ultima8/audio/audio_sample.cpp b/engines/ultima/ultima8/audio/audio_sample.cpp
index 40aeb4e77d3..25aaa1cb281 100644
--- a/engines/ultima/ultima8/audio/audio_sample.cpp
+++ b/engines/ultima/ultima8/audio/audio_sample.cpp
@@ -26,8 +26,7 @@ namespace Ultima {
namespace Ultima8 {
AudioSample::AudioSample(const uint8 *buffer, uint32 size, uint32 bits, bool stereo, bool deleteBuffer) :
- _sampleRate(0), _bits(bits), _stereo(stereo),
- _frameSize(0), _decompressorSize(0), _length(0),
+ _sampleRate(0), _bits(bits), _stereo(stereo), _length(0),
_bufferSize(size), _buffer(buffer), _deleteBuffer(deleteBuffer) {
}
diff --git a/engines/ultima/ultima8/audio/audio_sample.h b/engines/ultima/ultima8/audio/audio_sample.h
index 1a27d982860..4bfd498e161 100644
--- a/engines/ultima/ultima8/audio/audio_sample.h
+++ b/engines/ultima/ultima8/audio/audio_sample.h
@@ -22,6 +22,10 @@
#ifndef ULTIMA8_AUDIO_AUDIOSAMPLE_H
#define ULTIMA8_AUDIO_AUDIOSAMPLE_H
+namespace Audio {
+class SeekableAudioStream;
+}
+
namespace Ultima {
namespace Ultima8 {
@@ -30,8 +34,6 @@ protected:
uint32 _sampleRate;
uint32 _bits;
bool _stereo;
- int _frameSize;
- uint32 _decompressorSize;
uint32 _length;
uint32 _bufferSize;
@@ -52,21 +54,13 @@ public:
inline bool isStereo() const {
return _stereo;
}
- inline uint32 getFrameSize() const {
- return _frameSize;
- }
- inline uint32 getDecompressorDataSize() const {
- return _decompressorSize;
- }
//! get AudioSample _length (in samples)
inline uint32 getLength() const {
return _length;
}
- virtual void initDecompressor(void *DecompData) const = 0;
- virtual uint32 decompressFrame(void *DecompData, void *samples) const = 0;
- virtual void rewind(void *DecompData) const = 0;
+ virtual Audio::SeekableAudioStream *makeStream() const = 0;
};
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/audio/raw_audio_sample.cpp b/engines/ultima/ultima8/audio/raw_audio_sample.cpp
index 787f41553d8..38e7ad79f14 100644
--- a/engines/ultima/ultima8/audio/raw_audio_sample.cpp
+++ b/engines/ultima/ultima8/audio/raw_audio_sample.cpp
@@ -21,6 +21,8 @@
#include "ultima/ultima8/misc/common_types.h"
#include "ultima/ultima8/audio/raw_audio_sample.h"
+#include "common/memstream.h"
+#include "audio/decoders/raw.h"
namespace Ultima {
namespace Ultima8 {
@@ -29,43 +31,21 @@ RawAudioSample::RawAudioSample(const uint8 *buffer, uint32 size, uint32 rate,
bool signedData, bool stereo)
: AudioSample(buffer, size, 8, stereo, false), _signedData(signedData) {
_sampleRate = rate;
- _frameSize = 512;
- _decompressorSize = sizeof(RawDecompData);
_length = size;
}
RawAudioSample::~RawAudioSample() {
}
-void RawAudioSample::initDecompressor(void *DecompData) const {
- RawDecompData *decomp = reinterpret_cast<RawDecompData *>(DecompData);
- decomp->_pos = 0;
-}
-
-void RawAudioSample::rewind(void *DecompData) const {
- initDecompressor(DecompData);
-}
-
-uint32 RawAudioSample::decompressFrame(void *DecompData, void *samples) const {
- RawDecompData *decomp = reinterpret_cast<RawDecompData *>(DecompData);
-
- if (decomp->_pos == _bufferSize) return 0;
-
- uint32 count = _frameSize;
- if (decomp->_pos + count > _bufferSize)
- count = _bufferSize - decomp->_pos;
-
- if (!_signedData) {
- memcpy(samples, _buffer + decomp->_pos, count);
- } else {
- uint8 *dest = static_cast<uint8 *>(samples);
- for (unsigned int i = 0; i < count; ++i)
- dest[i] = _buffer[decomp->_pos + i] + 128;
- }
-
- decomp->_pos += count;
+Audio::SeekableAudioStream *RawAudioSample::makeStream() const {
+ Common::MemoryReadStream *stream = new Common::MemoryReadStream(_buffer, _bufferSize, DisposeAfterUse::NO);
+ byte flags = 0;
+ if (isStereo())
+ flags |= Audio::FLAG_STEREO;
+ if (!_signedData)
+ flags |= Audio::FLAG_UNSIGNED;
- return count;
+ return Audio::makeRawStream(stream, getRate(), flags, DisposeAfterUse::YES);
}
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/audio/raw_audio_sample.h b/engines/ultima/ultima8/audio/raw_audio_sample.h
index 00e6735ac3a..2b26dc06e27 100644
--- a/engines/ultima/ultima8/audio/raw_audio_sample.h
+++ b/engines/ultima/ultima8/audio/raw_audio_sample.h
@@ -33,16 +33,9 @@ public:
uint32 rate, bool signeddata, bool stereo);
~RawAudioSample() override;
- void initDecompressor(void *DecompData) const override;
- uint32 decompressFrame(void *DecompData, void *samples) const override;
- void rewind(void *DecompData) const override;
+ Audio::SeekableAudioStream *makeStream() const override;
protected:
-
- struct RawDecompData {
- uint32 _pos;
- };
-
bool _signedData;
};
diff --git a/engines/ultima/ultima8/audio/sonarc_audio_sample.cpp b/engines/ultima/ultima8/audio/sonarc_audio_sample.cpp
index d008c28f205..32d0ab40ba3 100644
--- a/engines/ultima/ultima8/audio/sonarc_audio_sample.cpp
+++ b/engines/ultima/ultima8/audio/sonarc_audio_sample.cpp
@@ -21,6 +21,9 @@
#include "ultima/ultima8/misc/common_types.h"
#include "ultima/ultima8/audio/sonarc_audio_sample.h"
+#include "common/memstream.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
namespace Ultima {
namespace Ultima8 {
@@ -51,9 +54,6 @@ SonarcAudioSample::SonarcAudioSample(uint8 const *buffer, uint32 size) :
// Get Num Frame Samples
_frameSize = *(_buffer + _srcOffset + 2);
_frameSize |= (*(_buffer + _srcOffset + 3)) << 8;
-
-
- _decompressorSize = sizeof(SonarcDecompData);
}
SonarcAudioSample::~SonarcAudioSample(void) {
@@ -198,19 +198,7 @@ int SonarcAudioSample::audio_decode(const uint8 *source, uint8 *dest) {
return 0;
}
-//
-// AudioSample Interface
-//
-
-void SonarcAudioSample::initDecompressor(void *DecompData) const {
- SonarcDecompData *decomp = reinterpret_cast<SonarcDecompData *>(DecompData);
- decomp->_pos = _srcOffset;
- decomp->_samplePos = 0;
-}
-
-uint32 SonarcAudioSample::decompressFrame(void *DecompData, void *samples) const {
- SonarcDecompData *decomp = reinterpret_cast<SonarcDecompData *>(DecompData);
-
+uint32 SonarcAudioSample::decompressFrame(SonarcDecompData *decomp, uint8 *samples) const {
if (decomp->_pos == _bufferSize) return 0;
if (decomp->_samplePos == _length) return 0;
@@ -222,7 +210,7 @@ uint32 SonarcAudioSample::decompressFrame(void *DecompData, void *samples) const
uint32 frame_samples = *(_buffer + decomp->_pos + 2);
frame_samples |= (*(_buffer + decomp->_pos + 3)) << 8;
- audio_decode(_buffer + decomp->_pos, reinterpret_cast<uint8 *>(samples));
+ audio_decode(_buffer + decomp->_pos, samples);
decomp->_pos += frame_bytes;
decomp->_samplePos += frame_samples;
@@ -230,10 +218,28 @@ uint32 SonarcAudioSample::decompressFrame(void *DecompData, void *samples) const
return frame_samples;
}
-void SonarcAudioSample::rewind(void *DecompData) const {
- SonarcDecompData *decomp = reinterpret_cast<SonarcDecompData *>(DecompData);
- decomp->_pos = _srcOffset;
- decomp->_samplePos = 0;
+Audio::SeekableAudioStream *SonarcAudioSample::makeStream() const {
+ // Init the _sample decompressor
+ SonarcDecompData decomp;
+ decomp._pos = _srcOffset;
+ decomp._samplePos = 0;
+
+ // Get the data for the _sample
+ Common::MemoryWriteStreamDynamic streamData(DisposeAfterUse::NO);
+ uint8 *framePtr = new uint8[_frameSize * 2];
+
+ uint32 frameSize;
+ while ((frameSize = decompressFrame(&decomp, framePtr)) != 0)
+ streamData.write(framePtr, frameSize);
+
+ delete[] framePtr;
+
+ // Create the _sample
+ return Audio::makeRawStream(
+ new Common::MemoryReadStream(streamData.getData(), streamData.size(), DisposeAfterUse::YES),
+ getRate(),
+ isStereo() ? Audio::FLAG_STEREO | Audio::FLAG_UNSIGNED : Audio::FLAG_UNSIGNED,
+ DisposeAfterUse::YES);
}
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/audio/sonarc_audio_sample.h b/engines/ultima/ultima8/audio/sonarc_audio_sample.h
index e221973bcc0..9578d8440d6 100644
--- a/engines/ultima/ultima8/audio/sonarc_audio_sample.h
+++ b/engines/ultima/ultima8/audio/sonarc_audio_sample.h
@@ -45,15 +45,17 @@ class SonarcAudioSample : public AudioSample {
uint8 *dest, const uint8 *factors);
static int audio_decode(const uint8 *source, uint8 *dest);
- uint32 _srcOffset;
+ int _frameSize;
+ uint32 _srcOffset;
public:
SonarcAudioSample(const uint8 *buffer, uint32 size);
~SonarcAudioSample(void) override;
- void initDecompressor(void *DecompData) const override;
- uint32 decompressFrame(void *DecompData, void *samples) const override;
- void rewind(void *DecompData) const override;
+ Audio::SeekableAudioStream *makeStream() const override;
+
+private:
+ uint32 decompressFrame(SonarcDecompData *decompData, uint8 *samples) const;
};
} // End of namespace Ultima8
More information about the Scummvm-git-logs
mailing list