[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