mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-01 15:09:47 +00:00
TITANIC: Starting to flesh out sound loading
This commit is contained in:
parent
7f947c0ef3
commit
de775c6bda
@ -24,4 +24,29 @@
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
QMixer::QMixer(Audio::Mixer *mixer) : _mixer(mixer) {
|
||||
}
|
||||
|
||||
bool QMixer::qsWaveMixInitEx(const QMIXCONFIG &config) {
|
||||
// Not current implemented in ScummVM
|
||||
return true;
|
||||
}
|
||||
|
||||
void QMixer::qsWaveMixActivate(bool fActivate) {
|
||||
// Not current implemented in ScummVM
|
||||
}
|
||||
|
||||
int QMixer::qsWaveMixOpenChannel(int iChannel, WaveMixOpenChannel mode) {
|
||||
// Not current implemented in ScummVM
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QMixer::qsWaveMixCloseSession() {
|
||||
_mixer->stopAll();
|
||||
}
|
||||
|
||||
void QMixer::qsWaveMixFreeWave(Audio::SoundHandle &handle) {
|
||||
_mixer->stopHandle(handle);
|
||||
}
|
||||
|
||||
} // End of namespace Titanic z
|
||||
|
@ -27,6 +27,35 @@
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
enum WaveMixOpenChannel {
|
||||
QMIX_OPENSINGLE = 0, // Open the single channel specified by iChannel
|
||||
QMIX_OPENALL = 1, // Opens all the channels, iChannel ignored
|
||||
QMIX_OPENCOUNT = 2, // Open iChannel Channels (eg. if iChannel = 4 will create channels 0-3)
|
||||
QMIX_OPENAVAILABLE = 3 // Open the first unopened channel, and return channel number
|
||||
};
|
||||
|
||||
/**
|
||||
* Mixer configuration structure for qsWaveMixInitEx
|
||||
*/
|
||||
struct QMIXCONFIG {
|
||||
uint32 dwSize;
|
||||
uint32 dwFlags;
|
||||
uint32 dwSamplingRate; // Sampling rate in Hz
|
||||
void *lpIDirectSound;
|
||||
const void *lpGuid;
|
||||
int iChannels; // Number of channels
|
||||
int iOutput; // if 0, uses best output device
|
||||
int iLatency; // (in ms) if 0, uses default for output device
|
||||
int iMath; // style of math
|
||||
uint hwnd;
|
||||
|
||||
QMIXCONFIG() : dwSize(40), dwFlags(0), dwSamplingRate(0), lpIDirectSound(nullptr),
|
||||
lpGuid(nullptr), iChannels(0), iOutput(0), iLatency(0), iMath(0), hwnd(0) {}
|
||||
QMIXCONFIG(uint32 rate, int channels, int latency) : dwSize(40), dwFlags(0),
|
||||
dwSamplingRate(rate), iChannels(channels), iLatency(latency),
|
||||
lpIDirectSound(nullptr), lpGuid(nullptr), iOutput(0), iMath(0), hwnd(0) {}
|
||||
};
|
||||
|
||||
/**
|
||||
* Vector positioning in metres
|
||||
*/
|
||||
@ -41,19 +70,43 @@ struct QSVECTOR {
|
||||
* QSound Labs, Inc. Which itself is apparently based on Microsoft's
|
||||
* WaveMix API.
|
||||
*
|
||||
* It does not currently have any actual code from
|
||||
* the library, and instead remaps calls to ScummVM's existing mixer
|
||||
* where possible. This means that advanced features of the QMixer
|
||||
* library, like being able to set up both the player and sounds at
|
||||
* different positions are currently ignored, and all sounds play
|
||||
* at full volume.
|
||||
* It does not currently have any actual code from the library,
|
||||
* and instead remaps calls to ScummVM's existing mixer where possible.
|
||||
* This means that advanced features of the QMixer library, like being
|
||||
* able to set up both the player and sounds at different positions are
|
||||
* currently ignored, and all sounds play at full volume.
|
||||
*/
|
||||
class QMixer {
|
||||
private:
|
||||
Audio::Mixer *_mixer;
|
||||
public:
|
||||
QMixer(Audio::Mixer *mixer) : _mixer(mixer) {}
|
||||
QMixer(Audio::Mixer *mixer);
|
||||
virtual ~QMixer() {}
|
||||
|
||||
/**
|
||||
* Initializes the mixer
|
||||
*/
|
||||
bool qsWaveMixInitEx(const QMIXCONFIG &config);
|
||||
|
||||
/**
|
||||
* Activates the mixer
|
||||
*/
|
||||
void qsWaveMixActivate(bool fActivate);
|
||||
|
||||
/**
|
||||
* Opens channels in the mixer for access
|
||||
*/
|
||||
int qsWaveMixOpenChannel(int iChannel, WaveMixOpenChannel mode);
|
||||
|
||||
/**
|
||||
* Closes down the mixer
|
||||
*/
|
||||
void qsWaveMixCloseSession();
|
||||
|
||||
/**
|
||||
* Stops a sound from playing
|
||||
*/
|
||||
void qsWaveMixFreeWave(Audio::SoundHandle &handle);
|
||||
};
|
||||
|
||||
} // End of namespace Titanic
|
||||
|
@ -24,6 +24,10 @@
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
const uint SAMPLING_RATE = 22050;
|
||||
const uint LATENCY = 100;
|
||||
const uint CHANNELS_COUNT = 16;
|
||||
|
||||
CSoundManager::CSoundManager() : _musicPercent(75.0), _speechPercent(75.0),
|
||||
_masterPercent(75.0), _parrotPercent(75.0), _field14(1) {
|
||||
}
|
||||
@ -33,11 +37,27 @@ CSoundManager::CSoundManager() : _musicPercent(75.0), _speechPercent(75.0),
|
||||
QSoundManager::QSoundManager(Audio::Mixer *mixer) : CSoundManager(), QMixer(mixer),
|
||||
_field18(0), _field1C(0) {
|
||||
Common::fill(&_field4A0[0], &_field4A0[16], 0);
|
||||
|
||||
qsWaveMixInitEx(QMIXCONFIG(SAMPLING_RATE, CHANNELS_COUNT, LATENCY));
|
||||
qsWaveMixActivate(true);
|
||||
qsWaveMixOpenChannel(0, QMIX_OPENALL);
|
||||
}
|
||||
|
||||
QSoundManager::~QSoundManager() {
|
||||
// Close down the mixer
|
||||
qsWaveMixCloseSession();
|
||||
}
|
||||
|
||||
CWaveFile *QSoundManager::loadSound(const CString &name) {
|
||||
warning("TODO");
|
||||
return nullptr;
|
||||
CWaveFile *waveFile = new CWaveFile();
|
||||
|
||||
// Try to load the specified sound
|
||||
if (!waveFile->loadSound(name)) {
|
||||
delete waveFile;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return waveFile;
|
||||
}
|
||||
|
||||
CWaveFile *QSoundManager::loadSpeech(CDialogueFile *dialogueFile, int speechId) {
|
||||
@ -98,13 +118,8 @@ int QSoundManager::proc16() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QSoundManager::WaveMixPump() {
|
||||
warning("TODO");
|
||||
}
|
||||
|
||||
bool QSoundManager::movieStarted() const {
|
||||
// TODO
|
||||
return 0;
|
||||
uint QSoundManager::getLatency() const {
|
||||
return LATENCY;
|
||||
}
|
||||
|
||||
void QSoundManager::proc19(int v) {
|
||||
@ -127,4 +142,8 @@ void QSoundManager::proc30() {
|
||||
warning("TODO");
|
||||
}
|
||||
|
||||
void QSoundManager::soundFreed(Audio::SoundHandle &handle) {
|
||||
qsWaveMixFreeWave(handle);
|
||||
}
|
||||
|
||||
} // End of namespace Titanic z
|
||||
|
@ -81,12 +81,11 @@ public:
|
||||
virtual bool isActive(const CWaveFile *waveFile) const { return false; }
|
||||
|
||||
virtual int proc16() const { return 0; }
|
||||
virtual void WaveMixPump() {}
|
||||
|
||||
/**
|
||||
* Called when a movie with audio is started
|
||||
* Returns the movie latency
|
||||
*/
|
||||
virtual bool movieStarted() const { return false; }
|
||||
virtual uint getLatency() const { return 0; }
|
||||
|
||||
virtual void setMusicPercent(double percent) { _musicPercent = percent; }
|
||||
virtual void setSpeechPercent(double percent) { _speechPercent = percent; }
|
||||
@ -138,7 +137,7 @@ public:
|
||||
int _field4A0[16];
|
||||
public:
|
||||
QSoundManager(Audio::Mixer *mixer);
|
||||
virtual ~QSoundManager() {}
|
||||
virtual ~QSoundManager();
|
||||
|
||||
/**
|
||||
* Loads a sound
|
||||
@ -176,13 +175,11 @@ public:
|
||||
virtual bool isActive(const CWaveFile *soundRes) const;
|
||||
|
||||
virtual int proc16() const;
|
||||
virtual void WaveMixPump();
|
||||
|
||||
|
||||
/**
|
||||
* Called when a movie with audio is started
|
||||
* Returns the movie latency
|
||||
*/
|
||||
virtual bool movieStarted() const;
|
||||
virtual uint getLatency() const;
|
||||
|
||||
virtual void proc19(int v);
|
||||
virtual void proc20(int v);
|
||||
@ -190,6 +187,11 @@ public:
|
||||
|
||||
virtual void proc29();
|
||||
virtual void proc30();
|
||||
|
||||
/**
|
||||
* Called when a wave file is freed
|
||||
*/
|
||||
void soundFreed(Audio::SoundHandle &handle);
|
||||
};
|
||||
|
||||
} // End of namespace Titanic
|
||||
|
@ -20,13 +20,35 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "audio/decoders/wave.h"
|
||||
#include "titanic/sound/wave_file.h"
|
||||
#include "titanic/sound/sound_manager.h"
|
||||
#include "titanic/support/simple_file.h"
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
CWaveFile::~CWaveFile() {
|
||||
if (_stream) {
|
||||
_owner->soundFreed(_soundHandle);
|
||||
delete _stream;
|
||||
}
|
||||
}
|
||||
|
||||
int CWaveFile::fn1() {
|
||||
// TODO
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool CWaveFile::loadSound(const CString &name) {
|
||||
assert(!_stream);
|
||||
|
||||
StdCWadFile file;
|
||||
if (!file.open(name))
|
||||
return false;
|
||||
|
||||
Common::SeekableReadStream *stream = file.readStream();
|
||||
_stream = Audio::makeWAVStream(stream->readStream(stream->size()), DisposeAfterUse::YES);
|
||||
}
|
||||
|
||||
|
||||
} // End of namespace Titanic z
|
||||
|
@ -23,32 +23,35 @@
|
||||
#ifndef TITANIC_WAVE_FILE_H
|
||||
#define TITANIC_WAVE_FILE_H
|
||||
|
||||
#include "titanic/support/simple_file.h"
|
||||
#include "audio/audiostream.h"
|
||||
#include "audio/mixer.h"
|
||||
#include "titanic/support/string.h"
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
class CSoundManager;
|
||||
class QSoundManager;
|
||||
|
||||
class CWaveFile {
|
||||
public:
|
||||
int _field0;
|
||||
int _field4;
|
||||
int _field8;
|
||||
uint _handle;
|
||||
CSoundManager *_owner;
|
||||
int _field14;
|
||||
int _field18;
|
||||
int _field1C;
|
||||
int _field20;
|
||||
int _field24;
|
||||
int _field28;
|
||||
int _field2C;
|
||||
QSoundManager *_owner;
|
||||
Audio::AudioStream *_stream;
|
||||
Audio::SoundHandle _soundHandle;
|
||||
public:
|
||||
CWaveFile() : _field0(2), _field4(0), _field8(0), _handle(0),
|
||||
_owner(nullptr), _field14(1), _field18(0), _field1C(0),
|
||||
_field20(0), _field24(0), _field28(0), _field2C(-1) {}
|
||||
CWaveFile() : _owner(nullptr), _stream(nullptr) {}
|
||||
CWaveFile(QSoundManager *owner) : _owner(owner), _stream(nullptr) {}
|
||||
~CWaveFile();
|
||||
|
||||
int fn1();
|
||||
|
||||
/**
|
||||
* Tries to load the specified wave file sound
|
||||
*/
|
||||
bool loadSound(const CString &name);
|
||||
|
||||
/**
|
||||
* Returns true if the wave file has data loaded
|
||||
*/
|
||||
bool isLoaded() const { return _stream != nullptr; }
|
||||
};
|
||||
|
||||
} // End of namespace Titanic
|
||||
|
@ -199,8 +199,8 @@ int OSMovie::getFrame() const {
|
||||
}
|
||||
|
||||
void OSMovie::movieStarted() {
|
||||
if (_aviSurface._hasAudio)
|
||||
_aviSurface._soundManager->movieStarted();
|
||||
//if (_aviSurface._hasAudio)
|
||||
// _aviSurface._soundManager->movieStarted();
|
||||
|
||||
// Register the movie in the playing list
|
||||
addToPlayingMovies();
|
||||
|
Loading…
Reference in New Issue
Block a user