aboutsummaryrefslogtreecommitdiff
path: root/backends/audiocd/macosx/macosx-audiocd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/audiocd/macosx/macosx-audiocd.cpp')
-rw-r--r--backends/audiocd/macosx/macosx-audiocd.cpp45
1 files changed, 30 insertions, 15 deletions
diff --git a/backends/audiocd/macosx/macosx-audiocd.cpp b/backends/audiocd/macosx/macosx-audiocd.cpp
index 76bae95500..07d8d31f26 100644
--- a/backends/audiocd/macosx/macosx-audiocd.cpp
+++ b/backends/audiocd/macosx/macosx-audiocd.cpp
@@ -47,8 +47,9 @@ public:
MacOSXAudioCDManager() {}
~MacOSXAudioCDManager();
- void playCD(int track, int num_loops, int start_frame, int duration);
- void closeCD();
+ bool open();
+ void close();
+ bool play(int track, int numLoops, int startFrame, int duration, bool onlyEmulate = false);
protected:
bool openCD(int drive);
@@ -74,7 +75,16 @@ private:
};
MacOSXAudioCDManager::~MacOSXAudioCDManager() {
- closeCD();
+ close();
+}
+
+bool MacOSXAudioCDManager::open() {
+ close();
+
+ if (openRealCD())
+ return true;
+
+ return DefaultAudioCDManager::open();
}
/**
@@ -95,8 +105,6 @@ static int findBaseDiskNumber(const Common::String &diskName) {
}
bool MacOSXAudioCDManager::openCD(int drive) {
- closeCD();
-
DriveList allDrives = detectAllDrives();
if (allDrives.empty())
return false;
@@ -137,8 +145,6 @@ bool MacOSXAudioCDManager::openCD(int drive) {
}
bool MacOSXAudioCDManager::openCD(const Common::String &drive) {
- closeCD();
-
DriveList drives = detectAllDrives();
for (uint32 i = 0; i < drives.size(); i++) {
@@ -154,8 +160,8 @@ bool MacOSXAudioCDManager::openCD(const Common::String &drive) {
return false;
}
-void MacOSXAudioCDManager::closeCD() {
- stop();
+void MacOSXAudioCDManager::close() {
+ DefaultAudioCDManager::close();
_trackMap.clear();
}
@@ -178,9 +184,17 @@ MacOSXAudioCDManager::DriveList MacOSXAudioCDManager::detectAllDrives() {
return drives;
}
-void MacOSXAudioCDManager::playCD(int track, int numLoops, int startFrame, int duration) {
- if (!_trackMap.contains(track) || (!numLoops && !startFrame))
- return;
+bool MacOSXAudioCDManager::play(int track, int numLoops, int startFrame, int duration, bool onlyEmulate) {
+ // Prefer emulation
+ if (DefaultAudioCDManager::play(track, numLoops, startFrame, duration, onlyEmulate))
+ return true;
+
+ // If we're set to only emulate, or have no CD drive, return here
+ if (onlyEmulate || !_trackMap.contains(track))
+ return false;
+
+ if (!numLoops && !startFrame)
+ return false;
// Now load the AIFF track from the name
Common::String fileName = _trackMap[track];
@@ -188,19 +202,19 @@ void MacOSXAudioCDManager::playCD(int track, int numLoops, int startFrame, int d
if (!stream) {
warning("Failed to open track '%s'", fileName.c_str());
- return;
+ return false;
}
Audio::AudioStream *audioStream = Audio::makeAIFFStream(stream, DisposeAfterUse::YES);
if (!audioStream) {
warning("Track '%s' is not an AIFF track", fileName.c_str());
- return;
+ return false;
}
Audio::SeekableAudioStream *seekStream = dynamic_cast<Audio::SeekableAudioStream *>(audioStream);
if (!seekStream) {
warning("Track '%s' is not seekable", fileName.c_str());
- return;
+ return false;
}
Audio::Timestamp start = Audio::Timestamp(0, startFrame, 75);
@@ -211,6 +225,7 @@ void MacOSXAudioCDManager::playCD(int track, int numLoops, int startFrame, int d
_mixer->playStream(Audio::Mixer::kMusicSoundType, &_handle,
Audio::makeLoopingAudioStream(seekStream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops), -1, _cd.volume, _cd.balance);
+ return true;
}
bool MacOSXAudioCDManager::findTrackNames(const Common::String &drivePath) {