[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