[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