Skip to content

Commit

Permalink
TSAGE: Initial implementation of AudioStream interface for sound driver
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Jun 20, 2011
1 parent dae19af commit 123f241
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 7 deletions.
6 changes: 1 addition & 5 deletions engines/tsage/events.cpp
Expand Up @@ -48,9 +48,8 @@ bool EventsClass::pollEvent() {
_priorFrameTime = milli;
++_frameNumber;

// Update screen and allow the sound manager to process pending sounds
// Update screen
g_system->updateScreen();
SoundManager::_sfSoundServer();
}

if (!g_system->getEventManager()->pollEvent(_event)) return false;
Expand Down Expand Up @@ -299,9 +298,6 @@ void EventsClass::delay(int numFrames) {

++_frameNumber;
_priorFrameTime = g_system->getMillis();

// Allow pending sounds to be processed
SoundManager::_sfSoundServer();
}

g_system->updateScreen();
Expand Down
51 changes: 50 additions & 1 deletion engines/tsage/sound.cpp
Expand Up @@ -51,6 +51,8 @@ SoundManager::SoundManager() {
_needToRethink = false;

_soTimeIndexFlag = false;
_updateTicksCounter = 0;
_eventsDelay = GAME_FRAME_TIME;
}

SoundManager::~SoundManager() {
Expand Down Expand Up @@ -114,6 +116,14 @@ void SoundManager::syncSounds() {
this->setMasterVol(musicVolume / 2);
}

void SoundManager::update() {
++_updateTicksCounter;
if (_updateTicksCounter > _eventsDelay) {
_sfSoundServer();
_updateTicksCounter = 0;
}
}

Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) {
assert(__sndmgrReady);
_availableDrivers.clear();
Expand Down Expand Up @@ -482,6 +492,10 @@ void SoundManager::_sfUpdateVoiceStructs2() {
}
}

void SoundManager::_sfUpdateCallback(void *ref) {
((SoundManager *)ref)->update();
}

/*--------------------------------------------------------------------------*/

void SoundManager::saveNotifier(bool postFlag) {
Expand Down Expand Up @@ -1293,7 +1307,8 @@ void SoundManager::_sfExtractGroupMask() {
bool SoundManager::_sfInstallDriver(SoundDriver *driver) {
if (!driver->open())
return false;


driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager());
sfManager()._installedDrivers.push_back(driver);
driver->_groupOffset = driver->getGroupData();
driver->_groupMask = READ_LE_UINT32(driver->_groupOffset);
Expand Down Expand Up @@ -2376,6 +2391,8 @@ const int v440D4[48] = {
};

AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
_upCb = NULL;
_upRef = NULL;
_minVersion = 0x102;
_maxVersion = 0x10A;
_masterVolume = 0;
Expand All @@ -2388,6 +2405,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
_mixer = _vm->_mixer;
_sampleRate = _mixer->getOutputRate();
_opl = makeAdLibOPL(_sampleRate);
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);

Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false);
memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
Expand All @@ -2404,6 +2422,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {

AdlibSoundDriver::~AdlibSoundDriver() {
DEALLOCATE(_patchData);
_mixer->stopHandle(_soundHandle);
OPLDestroy(_opl);
}

Expand Down Expand Up @@ -2640,4 +2659,34 @@ void AdlibSoundDriver::setFrequency(int channel) {
((dataWord >> 8) & 3) | (var2 << 2));
}

int AdlibSoundDriver::readBuffer(int16 *buffer, const int numSamples) {
update(buffer, numSamples);
return numSamples;
}

void AdlibSoundDriver::update(int16 *buf, int len) {
static int samplesLeft = 0;
while (len != 0) {
int count = samplesLeft;
if (count > len) {
count = len;
}
samplesLeft -= count;
len -= count;
YM3812UpdateOne(_opl, buf, count);
if (samplesLeft == 0) {
if (_upCb) {
(*_upCb)(_upRef);
}
samplesLeft = _sampleRate / 50;
}
buf += count;
}
}

void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) {
_upCb = upCb;
_upRef = ref;
}

} // End of namespace tSage
22 changes: 21 additions & 1 deletion engines/tsage/sound.h
Expand Up @@ -72,6 +72,10 @@ class SoundDriver {
uint32 _groupMask;
const GroupData *_groupOffset;
int _driverResID;

typedef void (*UpdateCallback)(void *);
UpdateCallback _upCb;
void *_upRef;
public:
SoundDriver();
virtual ~SoundDriver() {};
Expand Down Expand Up @@ -101,6 +105,8 @@ class SoundDriver {
virtual void proc38(int channel, int cmd, int value) {} // Method #19
virtual void setPitch(int channel, int pitchBlend) {} // Method #20
virtual void proc42(int channel, int v0, int v1) {} // Method #21

virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {}
};

struct VoiceStructEntryType0 {
Expand Down Expand Up @@ -171,6 +177,8 @@ class SoundManager : public SaveListener {
Common::List<Sound *> _soundList;
Common::List<SoundDriverEntry> _availableDrivers;
bool _needToRethink;
int _updateTicksCounter;
int _eventsDelay;
// Misc flags
bool _soTimeIndexFlag;
public:
Expand All @@ -181,6 +189,7 @@ class SoundManager : public SaveListener {
virtual void listenerSynchronize(Serializer &s);
virtual void postInit();
void syncSounds();
void update();

static void saveNotifier(bool postFlag);
void saveNotifierProc(bool postFlag);
Expand Down Expand Up @@ -243,6 +252,7 @@ class SoundManager : public SaveListener {
static void _sfProcessFading();
static void _sfUpdateVoiceStructs();
static void _sfUpdateVoiceStructs2();
static void _sfUpdateCallback(void *ref);
};

class Sound: public EventHandler {
Expand Down Expand Up @@ -387,11 +397,12 @@ class ASound: public EventHandler {

#define ADLIB_CHANNEL_COUNT 9

class AdlibSoundDriver: public SoundDriver {
class AdlibSoundDriver: public SoundDriver, Audio::AudioStream {
private:
GroupData _groupData;
Audio::Mixer *_mixer;
FM_OPL *_opl;
Audio::SoundHandle _soundHandle;
int _sampleRate;
byte _portContents[256];
const byte *_patchData;
Expand Down Expand Up @@ -428,6 +439,15 @@ class AdlibSoundDriver: public SoundDriver {
virtual void updateVoice(int channel);
virtual void proc38(int channel, int cmd, int value);
virtual void setPitch(int channel, int pitchBlend);
virtual void setUpdateCallback(UpdateCallback upCb, void *ref);

// AudioStream interface
virtual int readBuffer(int16 *buffer, const int numSamples);
virtual bool isStereo() const { return false; }
virtual bool endOfData() const { return false; }
virtual int getRate() const { return _sampleRate; }

void update(int16 *buf, int len);
};

} // End of namespace tSage
Expand Down

0 comments on commit 123f241

Please sign in to comment.