[Scummvm-git-logs] scummvm master -> c3256a614a2b3a6b70ffd7e82d19bea048e4015b

AndywinXp noreply at scummvm.org
Mon Jan 2 21:55:31 UTC 2023


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:
c3256a614a SCUMM: DIMUSE: Make engine sample rate and feed size parametric


Commit: c3256a614a2b3a6b70ffd7e82d19bea048e4015b
    https://github.com/scummvm/scummvm/commit/c3256a614a2b3a6b70ffd7e82d19bea048e4015b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2023-01-02T22:55:26+01:00

Commit Message:
SCUMM: DIMUSE: Make engine sample rate and feed size parametric

Changed paths:
    engines/scumm/imuse_digi/dimuse_defs.h
    engines/scumm/imuse_digi/dimuse_engine.cpp
    engines/scumm/imuse_digi/dimuse_engine.h
    engines/scumm/imuse_digi/dimuse_internalmixer.cpp
    engines/scumm/imuse_digi/dimuse_internalmixer.h
    engines/scumm/imuse_digi/dimuse_tracks.cpp
    engines/scumm/imuse_digi/dimuse_waveout.cpp
    engines/scumm/smush/smush_player.cpp


diff --git a/engines/scumm/imuse_digi/dimuse_defs.h b/engines/scumm/imuse_digi/dimuse_defs.h
index e4ac1a96064..2507f2a498b 100644
--- a/engines/scumm/imuse_digi/dimuse_defs.h
+++ b/engines/scumm/imuse_digi/dimuse_defs.h
@@ -40,18 +40,18 @@ namespace Scumm {
 #define DIMUSE_LARGE_FADE_DIM 350000
 #define DIMUSE_SMALL_FADE_DIM 44100
 
-#define DIMUSE_SAMPLERATE     22050
-#define DIMUSE_FEEDSIZE       512
-#define DIMUSE_NUM_WAVE_BUFS  8
-#define DIMUSE_SMUSH_SOUNDID  12345678
-#define DIMUSE_BUN_CHUNK_SIZE 0x2000
-#define DIMUSE_GROUP_SFX      1
-#define DIMUSE_GROUP_SPEECH   2
-#define DIMUSE_GROUP_MUSIC    3
-#define DIMUSE_GROUP_MUSICEFF 4
-#define DIMUSE_BUFFER_SPEECH  1
-#define DIMUSE_BUFFER_MUSIC   2
-#define DIMUSE_BUFFER_SMUSH   3
+#define DIMUSE_BASE_SAMPLERATE 22050
+#define DIMUSE_BASE_FEEDSIZE   512
+#define DIMUSE_NUM_WAVE_BUFS   8
+#define DIMUSE_SMUSH_SOUNDID   12345678
+#define DIMUSE_BUN_CHUNK_SIZE  0x2000
+#define DIMUSE_GROUP_SFX       1
+#define DIMUSE_GROUP_SPEECH    2
+#define DIMUSE_GROUP_MUSIC     3
+#define DIMUSE_GROUP_MUSICEFF  4
+#define DIMUSE_BUFFER_SPEECH   1
+#define DIMUSE_BUFFER_MUSIC    2
+#define DIMUSE_BUFFER_SMUSH    3
 
 #define DIMUSE_TIMER_BASE_RATE_HZ       50
 #define DIMUSE_TIMER_BASE_RATE_USEC     20000  // 1000000 / 50Hz
diff --git a/engines/scumm/imuse_digi/dimuse_engine.cpp b/engines/scumm/imuse_digi/dimuse_engine.cpp
index 2e92b40ebe4..d47647494b0 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.cpp
+++ b/engines/scumm/imuse_digi/dimuse_engine.cpp
@@ -50,6 +50,9 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::M
 	_callbackFps = DIMUSE_TIMER_BASE_RATE_HZ;
 	_usecPerInt = DIMUSE_TIMER_BASE_RATE_USEC;
 
+	_internalSampleRate = DIMUSE_BASE_SAMPLERATE;
+	_internalFeedSize = DIMUSE_BASE_FEEDSIZE * (_internalSampleRate / DIMUSE_BASE_SAMPLERATE);
+
 	_splayer = nullptr;
 	_isEarlyDiMUSE = (_vm->_game.id == GID_FT || (_vm->_game.id == GID_DIG && _vm->_game.features & GF_DEMO));
 
@@ -85,7 +88,7 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::M
 	_numAudioNames = 0;
 
 	_emptyMarker[0] = '\0';
-	_internalMixer = new IMuseDigiInternalMixer(mixer, _isEarlyDiMUSE);
+	_internalMixer = new IMuseDigiInternalMixer(mixer, _internalSampleRate, _isEarlyDiMUSE);
 	_groupsHandler = new IMuseDigiGroupsHandler(this);
 	_fadesHandler = new IMuseDigiFadesHandler(this);
 	_triggersHandler = new IMuseDigiTriggersHandler(this);
@@ -109,11 +112,11 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::M
 	if (_mixer->getOutputBufSize() != 0) {
 		// Let's find the optimal value for the maximum number of streams which can stay in the queue at once;
 		// (A number which is too low can lead to buffer underrun, while the higher the number is, the higher is the audio latency)
-		_maxQueuedStreams = (int)ceil((_mixer->getOutputBufSize() / _waveOutPreferredFeedSize) / ((float)_mixer->getOutputRate() / DIMUSE_SAMPLERATE));
+		_maxQueuedStreams = (int)ceil((_mixer->getOutputBufSize() / _waveOutPreferredFeedSize) / ((float)_mixer->getOutputRate() / _internalSampleRate));
 
 		// This mixer's optimal output sample rate for this audio engine is one which is a multiple of 22050Hz;
 		// if we're dealing with one which is a multiple of 48000Hz, compensate the number of queued streams...
-		if (_mixer->getOutputRate() % DIMUSE_SAMPLERATE) {
+		if (_mixer->getOutputRate() % _internalSampleRate) {
 			_maxQueuedStreams++;
 		}
 
@@ -760,6 +763,14 @@ bool IMuseDigital::queryNextSoundFile(int32 &bufSize, int32 &criticalSize, int32
 	return false;
 }
 
+int IMuseDigital::getSampleRate() {
+	return _internalSampleRate;
+}
+
+int IMuseDigital::getFeedSize() {
+	return _internalFeedSize;
+}
+
 void IMuseDigital::parseScriptCmds(int cmd, int soundId, int sub_cmd, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p) {
 	int b = soundId;
 	int c = sub_cmd;
diff --git a/engines/scumm/imuse_digi/dimuse_engine.h b/engines/scumm/imuse_digi/dimuse_engine.h
index 85dd2424f75..9f9aafa8876 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.h
+++ b/engines/scumm/imuse_digi/dimuse_engine.h
@@ -89,6 +89,8 @@ private:
 
 	// These three are manipulated in the waveOut functions
 	uint8 *_outputAudioBuffer;
+	int _internalFeedSize;
+	int _internalSampleRate;
 	int _outputFeedSize;
 	int _outputSampleRate;
 
@@ -189,7 +191,6 @@ private:
 
 	int _trackCount;
 	int _tracksPauseTimer;
-	int _tracksPrefSampleRate;
 	int _tracksMicroSecsToFeed;
 
 	int tracksInit();
@@ -299,7 +300,7 @@ private:
 	int _waveOutWriteIndex;
 	int _waveOutDisableWrite;
 
-	int waveOutInit(int sampleRate, waveOutParamsStruct *waveOutSettings);
+	int waveOutInit(waveOutParamsStruct *waveOutSettings);
 	void waveOutWrite(uint8 **audioBuffer, int &feedSize, int &sampleRate);
 	int waveOutDeinit();
 	void waveOutCallback();
@@ -342,6 +343,8 @@ public:
 	void floodMusicBuffer();
 	void fillStreamsWhileMusicCritical(int fillTimesAfter);
 	bool queryNextSoundFile(int32 &bufSize, int32 &criticalSize, int32 &freeSpace, int &paused);
+	int getSampleRate();
+	int getFeedSize();
 
 	bool isFTSoundEngine(); // Used in the handlers to check if we're using the FT version of the engine
 
diff --git a/engines/scumm/imuse_digi/dimuse_internalmixer.cpp b/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
index 43f7d1ccccc..74b2171798f 100644
--- a/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
+++ b/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
@@ -30,9 +30,9 @@
 
 namespace Scumm {
 
-IMuseDigiInternalMixer::IMuseDigiInternalMixer(Audio::Mixer *mixer, bool isEarlyDiMUSE) {
+IMuseDigiInternalMixer::IMuseDigiInternalMixer(Audio::Mixer *mixer, int sampleRate, bool isEarlyDiMUSE) {
 	_mixer = mixer;
-	_stream = Audio::makeQueuingAudioStream(DIMUSE_SAMPLERATE, _mixer->getOutputStereo());
+	_stream = Audio::makeQueuingAudioStream(sampleRate, _mixer->getOutputStereo());
 	_isEarlyDiMUSE = isEarlyDiMUSE;
 	_radioChatter = 0;
 	_amp8Table = nullptr;
diff --git a/engines/scumm/imuse_digi/dimuse_internalmixer.h b/engines/scumm/imuse_digi/dimuse_internalmixer.h
index 7e5ea79a84d..e9ecf18dc77 100644
--- a/engines/scumm/imuse_digi/dimuse_internalmixer.h
+++ b/engines/scumm/imuse_digi/dimuse_internalmixer.h
@@ -78,7 +78,7 @@ private:
 	void mixBits16Stereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
 
 public:
-	IMuseDigiInternalMixer(Audio::Mixer *mixer, bool isEarlyDiMUSE);
+	IMuseDigiInternalMixer(Audio::Mixer *mixer, int sampleRate, bool isEarlyDiMUSE);
 	~IMuseDigiInternalMixer();
 	int  init(int bytesPerSample, int numChannels, uint8 *mixBuf, int mixBufSize, int sizeSampleKB, int mixChannelsNum);
 	void setRadioChatter();
diff --git a/engines/scumm/imuse_digi/dimuse_tracks.cpp b/engines/scumm/imuse_digi/dimuse_tracks.cpp
index 2b180cf455e..86b86c031cb 100644
--- a/engines/scumm/imuse_digi/dimuse_tracks.cpp
+++ b/engines/scumm/imuse_digi/dimuse_tracks.cpp
@@ -27,9 +27,8 @@ int IMuseDigital::tracksInit() {
 	_trackCount = 6;
 	_tracksPauseTimer = 0;
 	_trackList = nullptr;
-	_tracksPrefSampleRate = DIMUSE_SAMPLERATE;
 
-	if (waveOutInit(DIMUSE_SAMPLERATE, &waveOutSettings))
+	if (waveOutInit(&waveOutSettings))
 		return -1;
 
 	if (_internalMixer->init(waveOutSettings.bytesPerSample,
diff --git a/engines/scumm/imuse_digi/dimuse_waveout.cpp b/engines/scumm/imuse_digi/dimuse_waveout.cpp
index 39f9b83163c..56080d9b6e8 100644
--- a/engines/scumm/imuse_digi/dimuse_waveout.cpp
+++ b/engines/scumm/imuse_digi/dimuse_waveout.cpp
@@ -23,13 +23,13 @@
 
 namespace Scumm {
 
-int IMuseDigital::waveOutInit(int sampleRate, waveOutParamsStruct *waveOutSettingsStruct) {
-	_waveOutSampleRate = sampleRate;
-
+int IMuseDigital::waveOutInit(waveOutParamsStruct *waveOutSettingsStruct) {
 	_waveOutBytesPerSample = 2;
 	_waveOutNumChannels = _mixer->getOutputStereo() ? 2 : 1;
 	_waveOutZeroLevel = 0;
-	_waveOutPreferredFeedSize = DIMUSE_FEEDSIZE;
+
+	_waveOutSampleRate = _internalSampleRate;
+	_waveOutPreferredFeedSize = _internalFeedSize;
 
 	// Nine buffers (waveOutPreferredFeedSize * 4 bytes each), two will be used for the mixer
 	_waveOutOutputBuffer = (uint8 *)malloc(_waveOutNumChannels * _waveOutBytesPerSample * _waveOutPreferredFeedSize * 9);
diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp
index de2bdd4c421..c94765a99e8 100644
--- a/engines/scumm/smush/smush_player.cpp
+++ b/engines/scumm/smush/smush_player.cpp
@@ -262,7 +262,7 @@ SmushPlayer::SmushPlayer(ScummEngine_v7 *scumm, IMuseDigital *imuseDigital, Insa
 	_smushAudioInitialized = false;
 	_smushAudioCallbackEnabled = false;
 
-	initAudio(DIMUSE_SAMPLERATE, 200000);
+	initAudio(_imuseDigital->getSampleRate(), 200000);
 }
 
 SmushPlayer::~SmushPlayer() {
@@ -1569,6 +1569,8 @@ void SmushPlayer::processDispatches(int16 feedSize) {
 	bool isPlayableTrack;
 	bool speechIsPlaying = false;
 
+	int engineBaseFeedSize = _imuseDigital->getFeedSize();
+
 	if (!_paused) {
 		if (_smushTracksNeedInit) {
 			_smushTracksNeedInit = false;
@@ -1657,7 +1659,7 @@ void SmushPlayer::processDispatches(int16 feedSize) {
 
 				fadeMixStartingPoint = 0;
 				while (fadeRemaining) {
-					fadeInFrameCount = (fadeRemaining < DIMUSE_FEEDSIZE / 2) ? fadeRemaining : DIMUSE_FEEDSIZE / 2;
+					fadeInFrameCount = (fadeRemaining < engineBaseFeedSize / 2) ? fadeRemaining : engineBaseFeedSize / 2;
 
 					if (fadeInFrameCount == maxFadeChunkSize) {
 						fadeFeedSize = feedSize;
@@ -1716,8 +1718,8 @@ void SmushPlayer::processDispatches(int16 feedSize) {
 								if (_smushDispatch[i].volumeStep < 16)
 									_smushDispatch[i].volumeStep++;
 
-								if (mixInFrameCount > DIMUSE_FEEDSIZE / 2)
-									mixInFrameCount = DIMUSE_FEEDSIZE / 2;
+								if (mixInFrameCount > engineBaseFeedSize / 2)
+									mixInFrameCount = engineBaseFeedSize / 2;
 
 								_smushTracks[i].state = TRK_STATE_PLAYING;
 
@@ -1731,8 +1733,8 @@ void SmushPlayer::processDispatches(int16 feedSize) {
 
 								_smushTracks[i].state = TRK_STATE_ENDING;
 
-								if (mixInFrameCount > DIMUSE_FEEDSIZE / 2)
-									mixInFrameCount = DIMUSE_FEEDSIZE / 2;
+								if (mixInFrameCount > engineBaseFeedSize / 2)
+									mixInFrameCount = engineBaseFeedSize / 2;
 
 								_smushDispatch[i].audioRemaining -= mixInFrameCount;
 								_smushDispatch[i].currentOffset += mixInFrameCount;




More information about the Scummvm-git-logs mailing list