[Scummvm-git-logs] scummvm master -> b5434d392207c24535196d188db88459d2b14c25
mikrosk
noreply at scummvm.org
Sun May 17 08:42:20 UTC 2026
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
4f711e456b BACKENDS: SDL: Explain mysterious duration += 5
b5434d3922 BACKENDS: ATARI: Add MetaDOS audiocd support
Commit: 4f711e456b0c7919595d1a0011e64ed373493806
https://github.com/scummvm/scummvm/commit/4f711e456b0c7919595d1a0011e64ed373493806
Author: Miro Kropacek (miro.kropacek at gmail.com)
Date: 2026-05-17T18:42:04+10:00
Commit Message:
BACKENDS: SDL: Explain mysterious duration += 5
Commit 32d69e8c introduced the initial padding which has over the years
iterated to its present form.
Changed paths:
backends/audiocd/sdl/sdl-audiocd.cpp
diff --git a/backends/audiocd/sdl/sdl-audiocd.cpp b/backends/audiocd/sdl/sdl-audiocd.cpp
index 4452f1a2e77..4d59ff69b45 100644
--- a/backends/audiocd/sdl/sdl-audiocd.cpp
+++ b/backends/audiocd/sdl/sdl-audiocd.cpp
@@ -103,7 +103,8 @@ bool SdlAudioCDManager::play(int track, int numLoops, int startFrame, int durati
if (!numLoops && !startFrame)
return false;
- // FIXME: Explain this.
+ // "Fix MI1 CD Audio (hopefully)", commit 32d69e8c
+ // FIXME: if still true, perhaps guard with a check for MI1?
if (duration > 0)
duration += 5;
Commit: b5434d392207c24535196d188db88459d2b14c25
https://github.com/scummvm/scummvm/commit/b5434d392207c24535196d188db88459d2b14c25
Author: Miro Kropacek (miro.kropacek at gmail.com)
Date: 2026-05-17T18:42:04+10:00
Commit Message:
BACKENDS: ATARI: Add MetaDOS audiocd support
Changed paths:
A backends/audiocd/atari/atari-audiocd.cpp
A backends/audiocd/atari/atari-audiocd.h
backends/mixer/atari/atari-mixer.cpp
backends/module.mk
backends/platform/atari/osystem_atari.cpp
backends/platform/atari/readme.txt
backends/platform/atari/readme.txt.in
diff --git a/backends/audiocd/atari/atari-audiocd.cpp b/backends/audiocd/atari/atari-audiocd.cpp
new file mode 100644
index 00000000000..b6e2b61a929
--- /dev/null
+++ b/backends/audiocd/atari/atari-audiocd.cpp
@@ -0,0 +1,377 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Based on SDL's MetaDOS CD-ROM driver by Patrice Mandin.
+ *
+ */
+
+#define FORCE_TEXT_CONSOLE
+
+#include "backends/audiocd/atari/atari-audiocd.h"
+
+#include <errno.h>
+#include <string.h>
+
+#include "common/config-manager.h"
+#include "common/debug.h"
+#include "common/str.h"
+#include "common/system.h"
+#include "common/textconsole.h"
+
+// Some ioctl() errno values which occur when the tray is empty
+#define ERRNO_TRAYEMPTY(err) \
+ ((err) == -EIO || (err) == -ENOENT || (err) == -EINVAL || (err) == -ENOMEDIUM)
+
+enum {
+ kFramesPerSecond = 75,
+ kSecondsPerMinute = 60
+};
+
+static int msfToFrames(const cd_ad &addr) {
+ return ((int)addr.msf.minute * kSecondsPerMinute + addr.msf.second)
+ * kFramesPerSecond + addr.msf.frame;
+}
+
+static void framesToMsf(int frames, cdrom_msf &msf, bool start) {
+ byte frame = frames % kFramesPerSecond;
+ frames /= kFramesPerSecond;
+ byte second = frames % kSecondsPerMinute;
+ frames /= kSecondsPerMinute;
+ byte minute = frames;
+
+ if (start) {
+ msf.cdmsf_min0 = minute;
+ msf.cdmsf_sec0 = second;
+ msf.cdmsf_frame0 = frame;
+ } else {
+ msf.cdmsf_min1 = minute;
+ msf.cdmsf_sec1 = second;
+ msf.cdmsf_frame1 = frame;
+ }
+}
+
+AtariAudioCDManager::AtariAudioCDManager()
+ : _numDrives(0),
+ _drive(-1),
+ _log2phys(nullptr),
+ _cdTrack(0),
+ _cdNumLoops(0),
+ _cdStartFrame(0),
+ _cdDuration(0),
+ _cdEndTime(0),
+ _cdStopTime(0) {
+
+ memset(_drives, 0, sizeof(_drives));
+
+ metainit_t metainit = { 0, 0, 0, 0 };
+ Metainit(&metainit);
+
+ if (metainit.version == nullptr) {
+ debug("AtariAudioCDManager: MetaDOS not installed");
+ return;
+ }
+
+ if (metainit.info != nullptr)
+ _log2phys = metainit.info->log2phys;
+
+ if (metainit.drives_map == 0) {
+ debug("AtariAudioCDManager: no MetaDOS devices present");
+ return;
+ }
+
+ // Probe each drive listed in the bitmap for a working CD subchannel ioctl
+ for (int i = 'A'; i <= 'Z' && _numDrives < kMaxDrives; ++i) {
+ if (!(metainit.drives_map & (1L << (i - 'A'))))
+ continue;
+
+ metaopen_t metaopen;
+ if (Metaopen(i, &metaopen) != 0)
+ continue;
+
+ cdrom_subchnl info;
+ info.cdsc_format = CDROM_MSF;
+ long err = Metaioctl(i, METADOS_IOCTL_MAGIC, CDROMSUBCHNL, &info);
+ if (err == 0 || ERRNO_TRAYEMPTY(err)) {
+ _drives[_numDrives].letter = i;
+ ++_numDrives;
+ }
+
+ Metaclose(i);
+ }
+
+ debug("AtariAudioCDManager: detected %d MetaDOS CD-ROM drive(s)", _numDrives);
+}
+
+AtariAudioCDManager::~AtariAudioCDManager() {
+ close();
+}
+
+bool AtariAudioCDManager::open() {
+ close();
+
+ if (openRealCD())
+ return true;
+
+ return DefaultAudioCDManager::open();
+}
+
+bool AtariAudioCDManager::openCD(int drive) {
+ if (drive < 0 || drive >= _numDrives)
+ return false;
+
+ const char letter = _drives[drive].letter;
+ if (Metaopen(letter, &_drives[drive].metaopen) != 0)
+ return false;
+
+ _drive = drive;
+
+ if (!loadTOC()) {
+ close();
+ return false;
+ }
+
+ debug("AtariAudioCDManager: opened CD drive %c:", letter);
+ return true;
+}
+
+void AtariAudioCDManager::close() {
+ DefaultAudioCDManager::close();
+
+ if (_drive >= 0) {
+ // Make sure playback stops before we close the drive
+ ioctl(CDROMSTOP, nullptr);
+ Metaclose(_drives[_drive].letter);
+ _drive = -1;
+ }
+
+ _tocEntries.clear();
+ _cdNumLoops = 0;
+ _cdEndTime = 0;
+ _cdStopTime = 0;
+}
+
+int AtariAudioCDManager::ioctl(int command, void *arg) const {
+ if (_drive < 0)
+ return -1;
+
+ long ret = Metaioctl(_drives[_drive].letter, METADOS_IOCTL_MAGIC, command, arg);
+ if (ret < 0)
+ warning("AtariAudioCDManager: ioctl(0x%x) failed: %s", command, strerror(-ret));
+ return (int)ret;
+}
+
+bool AtariAudioCDManager::loadTOC() {
+ cdrom_tochdr toc;
+ if (ioctl(CDROMREADTOCHDR, &toc) < 0)
+ return false;
+
+ const int numTracks = toc.cdth_trk1 - toc.cdth_trk0 + 1;
+ if (numTracks < 1)
+ return false;
+
+ _tocEntries.clear();
+ _tocEntries.reserve(numTracks + 1);
+
+ for (int i = 0; i <= numTracks; ++i) {
+ cdrom_tocentry entry;
+ memset(&entry, 0, sizeof(entry));
+ entry.cdte_track = (i == numTracks) ? CDROM_LEADOUT : (toc.cdth_trk0 + i);
+ entry.cdte_format = CDROM_MSF;
+
+ if (ioctl(CDROMREADTOCENTRY, &entry) < 0) {
+ _tocEntries.clear();
+ return false;
+ }
+
+ _tocEntries.push_back(entry);
+ }
+
+ return true;
+}
+
+bool AtariAudioCDManager::startPlayback(int track, int startFrame, int duration) {
+ const int trackStart = msfToFrames(_tocEntries[track].cdte_addr);
+ const int trackEnd = msfToFrames(_tocEntries[track + 1].cdte_addr);
+
+ const int startAbs = trackStart + startFrame;
+ const int endAbs = (duration == 0) ? trackEnd : (startAbs + duration);
+
+ if (endAbs <= startAbs || startAbs < trackStart)
+ return false;
+
+ cdrom_msf playtime;
+ framesToMsf(startAbs, playtime, true);
+ // The end MSF passed to CDROMPLAYMSF is inclusive
+ framesToMsf(endAbs - 1, playtime, false);
+
+ const int ret = ioctl(CDROMPLAYMSF, &playtime);
+ if (ret < 0) {
+ warning("AtariAudioCDManager: CDROMPLAYMSF on track %d [%d, %d) failed: %s",
+ track, startAbs, endAbs, strerror(-ret));
+ return false;
+ }
+
+ const int playFrames = endAbs - startAbs;
+ _cdEndTime = g_system->getMillis() + (uint32)playFrames * 1000u / kFramesPerSecond;
+ return true;
+}
+
+bool AtariAudioCDManager::play(int track, int numLoops, int startFrame, int duration, bool onlyEmulate,
+ Audio::Mixer::SoundType soundType) {
+ // Prefer emulation
+ if (DefaultAudioCDManager::play(track, numLoops, startFrame, duration, onlyEmulate, soundType))
+ return true;
+
+ // If we're set to only emulate, or have no CD, return here
+ if (onlyEmulate || _drive < 0)
+ return false;
+
+ if (!numLoops && !startFrame)
+ return false;
+
+ if (track < 0 || track >= (int)_tocEntries.size() - 1) {
+ warning("AtariAudioCDManager: no such track %d", track);
+ return false;
+ }
+
+ // Bail out if the track isn't an audio track
+ if (_tocEntries[track].cdte_ctrl & CDROM_DATA_TRACK) {
+ warning("AtariAudioCDManager: track %d is not audio", track);
+ return false;
+ }
+
+ // Pad the play range by five CDDA frames; introduced for MI1 CD audio
+ // in commit 32d69e8c ("Fix MI1 CD Audio (hopefully)") against the SDL
+ // backend, which drove a real CD drive the same way we do here.
+ if (duration > 0)
+ duration += 5;
+
+ if (!startPlayback(track, startFrame, duration))
+ return false;
+
+ _cdTrack = track;
+ _cdNumLoops = numLoops;
+ _cdStartFrame = startFrame;
+ _cdDuration = duration;
+ _cdStopTime = 0;
+ return true;
+}
+
+void AtariAudioCDManager::stop() {
+ DefaultAudioCDManager::stop();
+
+ // Stop CD audio in 1/10th of a second
+ _cdStopTime = g_system->getMillis() + 100;
+ _cdNumLoops = 0;
+}
+
+bool AtariAudioCDManager::isPlaying() const {
+ if (DefaultAudioCDManager::isPlaying())
+ return true;
+
+ if (_drive < 0 || _cdNumLoops == 0)
+ return false;
+
+ if (g_system->getMillis() < _cdEndTime)
+ return true;
+
+ cdrom_subchnl info;
+ info.cdsc_format = CDROM_MSF;
+ if (ioctl(CDROMSUBCHNL, &info) < 0)
+ return false;
+
+ return info.cdsc_audiostatus == CDROM_AUDIO_PLAY;
+}
+
+bool AtariAudioCDManager::existExtractedCDAudioFiles(uint track) {
+ // Extracted track files in the search path take priority
+ if (DefaultAudioCDManager::existExtractedCDAudioFiles(track))
+ return true;
+
+ // Otherwise treat the physical drive as the source: if the game data
+ // path lives on a MetaDOS CD-ROM drive we detected, the engine can
+ // rely on AtariAudioCDManager::play() to drive the disc directly and
+ // the "please rip your tracks" warning is misleading.
+ if (_numDrives == 0 || !ConfMan.hasKey("path"))
+ return false;
+
+ const Common::String gamePath = ConfMan.getPath("path").toString(Common::Path::kNativeSeparator);
+ if (gamePath.size() < 2 || gamePath[1] != ':')
+ return false;
+
+ const char letter = (gamePath[0] >= 'a' && gamePath[0] <= 'z')
+ ? (gamePath[0] - 'a' + 'A') : gamePath[0];
+
+ // Direct match (GEMDOS letter == BOS letter)
+ for (int i = 0; i < _numDrives; ++i)
+ if (_drives[i].letter == letter)
+ return true;
+
+ // GEMDOS letter resolves through MetaDOS log2phys to a BOS letter
+ // (e.g. ExtenDOS unidrive.bos with "p:z" presents BOS Z: as GEMDOS P:).
+ // log2phys[] is indexed by GEMDOS drive number (A=0..Z=25) and stores
+ // the BOS letter as a raw ASCII byte (or 0 if unmapped).
+ if (_log2phys != nullptr && letter >= 'A' && letter <= 'Z') {
+ const char bos = _log2phys[letter - 'A'];
+ if (bos >= 'A' && bos <= 'Z') {
+ for (int i = 0; i < _numDrives; ++i)
+ if (_drives[i].letter == bos)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void AtariAudioCDManager::update() {
+ DefaultAudioCDManager::update();
+
+ if (_drive < 0)
+ return;
+
+ const uint32 now = g_system->getMillis();
+
+ if (_cdStopTime != 0 && now >= _cdStopTime) {
+ ioctl(CDROMSTOP, nullptr);
+ _cdNumLoops = 0;
+ _cdStopTime = 0;
+ return;
+ }
+
+ if (_cdNumLoops == 0 || now < _cdEndTime)
+ return;
+
+ // Make sure the drive has really finished before we restart the track
+ cdrom_subchnl info;
+ info.cdsc_format = CDROM_MSF;
+ const bool stillPlaying = (ioctl(CDROMSUBCHNL, &info) == 0)
+ && info.cdsc_audiostatus == CDROM_AUDIO_PLAY;
+
+ if (_cdNumLoops != 1 && stillPlaying) {
+ // Wait another second for it to be done
+ _cdEndTime += 1000;
+ return;
+ }
+
+ if (_cdNumLoops > 0)
+ --_cdNumLoops;
+
+ if (_cdNumLoops != 0)
+ startPlayback(_cdTrack, _cdStartFrame, _cdDuration);
+}
diff --git a/backends/audiocd/atari/atari-audiocd.h b/backends/audiocd/atari/atari-audiocd.h
new file mode 100644
index 00000000000..d6e75a95079
--- /dev/null
+++ b/backends/audiocd/atari/atari-audiocd.h
@@ -0,0 +1,83 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef BACKENDS_AUDIOCD_ATARI_H
+#define BACKENDS_AUDIOCD_ATARI_H
+
+#include "backends/audiocd/default/default-audiocd.h"
+
+#include <mint/cdromio.h>
+#include <mint/metados.h>
+
+#include "common/array.h"
+
+/**
+ * The Atari MetaDOS audio cd manager. Implements real audio cd playback
+ * via the MetaDOS BOS drivers.
+ */
+class AtariAudioCDManager final : public DefaultAudioCDManager {
+public:
+ AtariAudioCDManager();
+ ~AtariAudioCDManager() override;
+
+ bool open() override;
+ void close() override;
+ bool play(int track, int numLoops, int startFrame, int duration, bool onlyEmulate,
+ Audio::Mixer::SoundType soundType) override;
+ void stop() override;
+ bool isPlaying() const override;
+ void update() override;
+ bool existExtractedCDAudioFiles(uint track) override;
+
+protected:
+ bool openCD(int drive) override;
+
+private:
+ enum { kMaxDrives = 32 };
+
+ struct Drive {
+ char letter; // Drive letter ('A'..'Z'), 0 if absent
+ metaopen_t metaopen; // Filled in while the drive is open
+ };
+
+ bool loadTOC();
+ int ioctl(int command, void *arg) const;
+ bool startPlayback(int track, int startFrame, int duration);
+
+ Drive _drives[kMaxDrives];
+ int _numDrives;
+ int _drive; // Index into _drives, -1 if no drive is open
+
+ // GEMDOS-to-BOS drive mapping table from metainit.info->log2phys
+ // (NULL if MetaDOS didn't supply one)
+ const char *_log2phys;
+
+ Common::Array<cdrom_tocentry> _tocEntries; // Includes the leadout as the final entry
+
+ int _cdTrack;
+ int _cdNumLoops;
+ int _cdStartFrame;
+ int _cdDuration;
+ uint32 _cdEndTime;
+ uint32 _cdStopTime;
+};
+
+#endif
diff --git a/backends/mixer/atari/atari-mixer.cpp b/backends/mixer/atari/atari-mixer.cpp
index c03c8a4ec6b..e60f2b497e5 100644
--- a/backends/mixer/atari/atari-mixer.cpp
+++ b/backends/mixer/atari/atari-mixer.cpp
@@ -144,6 +144,11 @@ void AtariMixerManager::init() {
Xbtimer(XB_TIMERA, 1<<3, 1, timerA); // event count mode, count to '1'
Jenabint(MFP_TIMERA);
+ // route both mic channels to the ADC
+ Soundcmd(ADCINPUT, 0);
+ // enable and mix both sources (ADC and connection matrix) to the output
+ Soundcmd(ADDERIN, MATIN|ADCIN);
+
_samplesBuf = new uint8[_samples * _outputChannels * 2]; // always 16-bit
_mixer = new Audio::MixerImpl(_outputRate, _outputChannels == 2, _samples);
diff --git a/backends/module.mk b/backends/module.mk
index e329ae04fa2..f15e8947d81 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -423,6 +423,7 @@ endif
ifeq ($(BACKEND),atari)
MODULE_OBJS += \
+ audiocd/atari/atari-audiocd.o \
events/atari/atari-events.o \
fs/atari/atari-fs.o \
fs/atari/atari-fs-factory.o \
diff --git a/backends/platform/atari/osystem_atari.cpp b/backends/platform/atari/osystem_atari.cpp
index c3ff8ec2bc8..6bcd47b04ef 100644
--- a/backends/platform/atari/osystem_atari.cpp
+++ b/backends/platform/atari/osystem_atari.cpp
@@ -42,20 +42,20 @@
#include "backends/platform/atari/osystem_atari.h"
-#include "backends/audiocd/default/default-audiocd.h"
-#ifdef DYNAMIC_MODULES
-#include "backends/plugins/atari/atari-provider.h"
-#endif
-#include "common/config-manager.h"
+#include "backends/audiocd/atari/atari-audiocd.h"
#include "backends/events/atari/atari-events.h"
#include "backends/events/default/default-events.h"
#include "backends/graphics/atari/atari-graphics.h"
#include "backends/keymapper/hardware-input.h"
#include "backends/mixer/atari/atari-mixer.h"
#include "backends/mutex/null/null-mutex.h"
+#ifdef DYNAMIC_MODULES
+#include "backends/plugins/atari/atari-provider.h"
+#endif
#include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h"
#include "base/main.h"
+#include "common/config-manager.h"
#include "common/debug.h"
#define INPUT_ACTIVE
@@ -360,6 +360,8 @@ void OSystem_Atari::initBackend() {
// Setup and start mixer
_mixerManager->init();
+ _audiocdManager = new AtariAudioCDManager();
+
BaseBackend::initBackend();
}
diff --git a/backends/platform/atari/readme.txt b/backends/platform/atari/readme.txt
index 504abf272b4..5a378f81c82 100644
--- a/backends/platform/atari/readme.txt
+++ b/backends/platform/atari/readme.txt
@@ -41,7 +41,7 @@ for more details (TBD).
Atari Full package
~~~~~~~~~~~~~~~~~~
-Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
+Minimum hardware requirements: Atari Falcon with 4 + 32 MB RAM and 68040 CPU.
- Because there is limited horsepower available on our platform, features like
16bpp graphics, software synthesisers, scalers, real-time software
@@ -69,7 +69,9 @@ Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
- Support for PC keys (page up, page down, pause, F11/F12, ...) and mouse wheel
(Eiffel/Aranym only).
-- Native MIDI output (if present).
+- Native MIDI output.
+
+- Native CDDA support.
- Runs also in Hatari and ARAnyM but in case of ARAnyM don't forget to disable
fVDI to enable Videl output.
@@ -79,7 +81,7 @@ Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
Atari Lite package
~~~~~~~~~~~~~~~~~~
-Minimum hardware requirements: Atari TT / Falcon with 4 + 32 MB RAM.
+Minimum hardware requirements: Atari TT / Falcon with 16 MB RAM.
As a further optimisation step, a 030-only version of ScummVM is provided,
aimed at less powerful TT and Falcon machines with the 68030 CPU. It
@@ -159,7 +161,7 @@ the hardware connected:
The lower the value, the faster the mixing but the worse the quality. The
default is 22050 Hz in Full and 11025 Hz in Lite (16-bit, stereo), to natively
support most (DOS/Windows) games that use these frequencies. On TT and Falcon
-systems without an external DSP clock, these frequencies are converted to
+systems without an external DSP clock, these frequencies are adjusted to
19668 Hz and 9834 Hz, respectively. Note that you do not need to enter
the exact value; it will be rounded automatically to the nearest suitable
value.
@@ -413,9 +415,46 @@ The least amount of cycles is spent when:
11025 Hz!
- "Subtitles" as "Text and speech": This prevents any sampled speech to be
mixed.
-- All external audio files are deleted (typically *.wav); that way the mixer
- won't have anything to mix. However beware, this is not allowed in every
- game!
+- All external audio files are deleted (typically *.wav) or sourced from audio
+ cd; that way the mixer won't have anything to mix. However beware, deleting
+ files is not supported by every game!
+
+CDDA (Audio CD) support
+~~~~~~~~~~~~~~~~~~~~~~~
+
+ScummVM has supported native audio cd playback for a long time. It is even
+enabled in the FireBee (SDL) build. However native support in the Atari builds
+has been added just recently. This feature can be used to free the audio mixer
+from loading, decoding and mixing game music with sound effects, leaving more
+CPU time for the engine itself. The following configurations have been tested:
+
+- ExtenDOS 4.10
+ - its cd.bos has a bug preventing ScummVM loading a file from CD on
+ Falcon030 in TOS4 (030) mode (works fine when executed from HDD)
+ - works perfectly on CT60
+- CD Tools 2.10
+ - based on MetaDOS 2.62, don't run CACHEON.PRG before METADOS.PRG on CT60
+ - otherwise works perfectly in both 030 and 060 mode
+- Spin! 0.34
+ - based on MetaDOS 2.74, disabled cache doesn't help on CT60!
+- BetaDOS 3.12
+ - don't run CACHEON.PRG before BETADOS.PRG on CT60
+ - otherwise works perfectly in both 030 and 060 mode
+
+The MetaDOS API allows mixing various components:
+
+- extendos.prg / metados.prg / betados.prg
+- hs-cdrom.bos (CD Tools) / spin_sd.bos (Spin!)
+- bd_9660f.dos (BetaDOS) / hs-iso.dos (CD Tools) / iso9660f.dos (MetaDOS) /
+ unidrive.dos (ExtenDOS)
+- cd.bos from ExtenDOS strictly requires unidrive.dos
+
+So to mitigate the loading bug you can (in order of user friendliness):
+
+- Copy data files from CD to hard disk (makes sense also for speed reasons),
+ and ignore the message box with advice about ripping tracks from CD.
+- Edit extendos.cnf and replace cd.bos with e.g. spin_sd.bos.
+- Not use ExtenDOS.
Sample rate
~~~~~~~~~~~
@@ -536,8 +575,6 @@ Future plans
- Avoid decoding music/speech files (and thus slowing down everything) if muted.
-- True audio CD support via MetaDOS API.
-
Closing words
-------------
diff --git a/backends/platform/atari/readme.txt.in b/backends/platform/atari/readme.txt.in
index f0ec035feb3..7c898ab9f9d 100644
--- a/backends/platform/atari/readme.txt.in
+++ b/backends/platform/atari/readme.txt.in
@@ -41,7 +41,7 @@ for more details (TBD).
Atari Full package
~~~~~~~~~~~~~~~~~~
-Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
+Minimum hardware requirements: Atari Falcon with 4 + 32 MB RAM and 68040 CPU.
- Because there is limited horsepower available on our platform, features like
16bpp graphics, software synthesisers, scalers, real-time software
@@ -69,7 +69,9 @@ Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
- Support for PC keys (page up, page down, pause, F11/F12, ...) and mouse wheel
(Eiffel/Aranym only).
-- Native MIDI output (if present).
+- Native MIDI output.
+
+- Native CDDA support.
- Runs also in Hatari and ARAnyM but in case of ARAnyM don't forget to disable
fVDI to enable Videl output.
@@ -79,7 +81,7 @@ Minimum hardware requirements: Atari Falcon with 4 + 64 MB RAM, 68040 CPU.
Atari Lite package
~~~~~~~~~~~~~~~~~~
-Minimum hardware requirements: Atari TT / Falcon with 4 + 32 MB RAM.
+Minimum hardware requirements: Atari TT / Falcon with 16 MB RAM.
As a further optimisation step, a 030-only version of ScummVM is provided,
aimed at less powerful TT and Falcon machines with the 68030 CPU. It
@@ -159,7 +161,7 @@ the hardware connected:
The lower the value, the faster the mixing but the worse the quality. The
default is 22050 Hz in Full and 11025 Hz in Lite (16-bit, stereo), to natively
support most (DOS/Windows) games that use these frequencies. On TT and Falcon
-systems without an external DSP clock, these frequencies are converted to
+systems without an external DSP clock, these frequencies are adjusted to
19668 Hz and 9834 Hz, respectively. Note that you do not need to enter
the exact value; it will be rounded automatically to the nearest suitable
value.
@@ -413,9 +415,46 @@ The least amount of cycles is spent when:
11025 Hz!
- "Subtitles" as "Text and speech": This prevents any sampled speech to be
mixed.
-- All external audio files are deleted (typically *.wav); that way the mixer
- won't have anything to mix. However beware, this is not allowed in every
- game!
+- All external audio files are deleted (typically *.wav) or sourced from audio
+ cd; that way the mixer won't have anything to mix. However beware, deleting
+ files is not supported by every game!
+
+CDDA (Audio CD) support
+~~~~~~~~~~~~~~~~~~~~~~~
+
+ScummVM has supported native audio cd playback for a long time. It is even
+enabled in the FireBee (SDL) build. However native support in the Atari builds
+has been added just recently. This feature can be used to free the audio mixer
+from loading, decoding and mixing game music with sound effects, leaving more
+CPU time for the engine itself. The following configurations have been tested:
+
+- ExtenDOS 4.10
+ - its cd.bos has a bug preventing ScummVM loading a file from CD on
+ Falcon030 in TOS4 (030) mode (works fine when executed from HDD)
+ - works perfectly on CT60
+- CD Tools 2.10
+ - based on MetaDOS 2.62, don't run CACHEON.PRG before METADOS.PRG on CT60
+ - otherwise works perfectly in both 030 and 060 mode
+- Spin! 0.34
+ - based on MetaDOS 2.74, disabled cache doesn't help on CT60!
+- BetaDOS 3.12
+ - don't run CACHEON.PRG before BETADOS.PRG on CT60
+ - otherwise works perfectly in both 030 and 060 mode
+
+The MetaDOS API allows mixing various components:
+
+- extendos.prg / metados.prg / betados.prg
+- hs-cdrom.bos (CD Tools) / spin_sd.bos (Spin!)
+- bd_9660f.dos (BetaDOS) / hs-iso.dos (CD Tools) / iso9660f.dos (MetaDOS) /
+ unidrive.dos (ExtenDOS)
+- cd.bos from ExtenDOS strictly requires unidrive.dos
+
+So to mitigate the loading bug you can (in order of user friendliness):
+
+- Copy data files from CD to hard disk (makes sense also for speed reasons),
+ and ignore the message box with advice about ripping tracks from CD.
+- Edit extendos.cnf and replace cd.bos with e.g. spin_sd.bos.
+- Not use ExtenDOS.
Sample rate
~~~~~~~~~~~
@@ -536,8 +575,6 @@ Future plans
- Avoid decoding music/speech files (and thus slowing down everything) if muted.
-- True audio CD support via MetaDOS API.
-
Closing words
-------------
More information about the Scummvm-git-logs
mailing list