changes to imuse

svn-id: r5157
This commit is contained in:
Paweł Kołodziejski 2002-10-15 21:55:04 +00:00
parent 15ac1c1ee9
commit 09225027f1
6 changed files with 53 additions and 44 deletions

View file

@ -4997,11 +4997,18 @@ static void imus_digital_handler(void * engine) {
IMuseDigital::IMuseDigital(Scumm *scumm) { IMuseDigital::IMuseDigital(Scumm *scumm) {
memset(_channel, 0, sizeof(channel) * MAX_DIGITAL_CHANNELS); memset(_channel, 0, sizeof(channel) * MAX_DIGITAL_CHANNELS);
_scumm = scumm; _scumm = scumm;
for (int32 l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
_channel[l]._mixerTrack = -1;
}
_scumm->_mixer->beginSlots(MAX_DIGITAL_CHANNELS + 1);
_scumm->_timer->installProcedure(imus_digital_handler, 200); _scumm->_timer->installProcedure(imus_digital_handler, 200);
_pause = false; _pause = false;
} }
IMuseDigital::~IMuseDigital() { IMuseDigital::~IMuseDigital() {
for (int32 l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
_scumm->_mixer->stop(l);
}
_scumm->_timer->releaseProcedure(imus_digital_handler); _scumm->_timer->releaseProcedure(imus_digital_handler);
} }
@ -5406,7 +5413,6 @@ void IMuseDigital::handler() {
if (_channel[l]._toBeRemoved == true) { if (_channel[l]._toBeRemoved == true) {
_channel[l]._used = false; _channel[l]._used = false;
free(_channel[l]._data); free(_channel[l]._data);
memset(&_channel[l], 0, sizeof(channel));
continue; continue;
} }
@ -5507,16 +5513,11 @@ void IMuseDigital::handler() {
} }
} }
if (_channel[l]._mixerTrack == -1) { if (_channel[l]._mixerTrack == -1) {
_channel[l]._mixerTrack = _scumm->_mixer->playStream(NULL, -1, buf, mixer_size, _channel[l]._mixerTrack = _scumm->_mixer->playStream(NULL, l, buf, mixer_size,
_channel[l]._freq, _channel[l]._mixerFlags); _channel[l]._freq, _channel[l]._mixerFlags, -1, 800000);
continue;
} else if (_scumm->_mixer->_channels[_channel[l]._mixerTrack] == NULL) {
_channel[l]._mixerTrack = _scumm->_mixer->playStream(NULL, -1, buf, mixer_size,
_channel[l]._freq, _channel[l]._mixerFlags);
} else { } else {
_scumm->_mixer->append(_channel[l]._mixerTrack, buf, mixer_size, _scumm->_mixer->append(l, buf, mixer_size,
_channel[l]._freq, _channel[l]._mixerFlags); _channel[l]._freq, _channel[l]._mixerFlags);
} }
} }
@ -5550,7 +5551,6 @@ void IMuseDigital::startSound(int sound) {
if (READ_UINT32_UNALIGNED(ptr) == MKID('Crea')) { if (READ_UINT32_UNALIGNED(ptr) == MKID('Crea')) {
_channel[l]._bits = 8; _channel[l]._bits = 8;
_channel[l]._channels = 2; _channel[l]._channels = 2;
_channel[l]._mixerTrack = -1;
_channel[l]._mixerSize = (22050 / 5) * 2; _channel[l]._mixerSize = (22050 / 5) * 2;
_channel[l]._mixerFlags = SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED; _channel[l]._mixerFlags = SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED;
byte * t_ptr= _scumm->_sound->readCreativeVocFile(ptr, size, _channel[l]._freq, _channel[l]._numLoops); byte * t_ptr= _scumm->_sound->readCreativeVocFile(ptr, size, _channel[l]._freq, _channel[l]._numLoops);
@ -5624,6 +5624,11 @@ void IMuseDigital::startSound(int sound) {
if (tag == MKID_BE('DATA')) break; if (tag == MKID_BE('DATA')) break;
} }
if ((sound == 123) || (sound == 122)) {
_channel[l]._isJump = false;
_channel[l]._numJumps = 0;
}
uint32 header_size = ptr - s_ptr; uint32 header_size = ptr - s_ptr;
_channel[l]._offsetStop -= header_size; _channel[l]._offsetStop -= header_size;
if (_channel[l]._bits == 12) { if (_channel[l]._bits == 12) {
@ -5646,7 +5651,6 @@ void IMuseDigital::startSound(int sound) {
} }
} }
} }
_channel[l]._mixerTrack = -1;
_channel[l]._mixerSize = (22050 / 5) * 2; _channel[l]._mixerSize = (22050 / 5) * 2;
_channel[l]._mixerFlags = SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO; _channel[l]._mixerFlags = SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
if (_channel[l]._bits == 12) { if (_channel[l]._bits == 12) {

View file

@ -61,7 +61,7 @@ private:
IMuseInternal *_imuse; // Pointer to the real imuse object IMuseInternal *_imuse; // Pointer to the real imuse object
}; };
#define MAX_DIGITAL_CHANNELS 16 #define MAX_DIGITAL_CHANNELS 8
#define MAX_IMUSE_JUMPS 1 #define MAX_IMUSE_JUMPS 1
#define MAX_IMUSE_REGIONS 3 #define MAX_IMUSE_REGIONS 3

View file

@ -51,8 +51,8 @@ public:
bool update(); bool update();
}; };
ScummMixer::ScummMixer(SoundMixer * m) : _mixer(m), _nextIndex(0) { ScummMixer::ScummMixer(SoundMixer * m) : _mixer(m), _nextIndex(_mixer->_beginSlots) {
for(int32 i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(int32 i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
_channels[i].id = -1; _channels[i].id = -1;
_channels[i].chan = 0; _channels[i].chan = 0;
_channels[i].first = true; _channels[i].first = true;
@ -69,7 +69,7 @@ bool ScummMixer::init() {
_Channel * ScummMixer::findChannel(int32 track) { _Channel * ScummMixer::findChannel(int32 track) {
debug(9, "scumm_mixer::findChannel(%d)", track); debug(9, "scumm_mixer::findChannel(%d)", track);
for(int32 i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(int32 i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
if(_channels[i].id == track) if(_channels[i].id == track)
return _channels[i].chan; return _channels[i].chan;
} }
@ -82,11 +82,11 @@ bool ScummMixer::addChannel(_Channel * c) {
debug(9, "ScummMixer::addChannel(%d)", track); debug(9, "ScummMixer::addChannel(%d)", track);
for(i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
if(_channels[i].id == track) if(_channels[i].id == track)
warning("mixer::addChannel(%d) : channel already exist !", track); warning("mixer::addChannel(%d) : channel already exist !", track);
} }
if(_nextIndex >= SoundMixer::NUM_CHANNELS) _nextIndex = 0; if(_nextIndex >= SoundMixer::NUM_CHANNELS) _nextIndex = _mixer->_beginSlots;
for(i = _nextIndex; i < SoundMixer::NUM_CHANNELS; i++) { for(i = _nextIndex; i < SoundMixer::NUM_CHANNELS; i++) {
if(_channels[i].chan == 0 || _channels[i].id == -1) { if(_channels[i].chan == 0 || _channels[i].id == -1) {
@ -98,7 +98,7 @@ bool ScummMixer::addChannel(_Channel * c) {
} }
} }
for(i = 0; i < _nextIndex; i++) { for(i = _mixer->_beginSlots; i < _nextIndex; i++) {
if(_channels[i].chan == 0 || _channels[i].id == -1) { if(_channels[i].chan == 0 || _channels[i].id == -1) {
_channels[i].chan = c; _channels[i].chan = c;
_channels[i].id = track; _channels[i].id = track;
@ -110,7 +110,7 @@ bool ScummMixer::addChannel(_Channel * c) {
fprintf(stderr, "_nextIndex == %d\n", _nextIndex); fprintf(stderr, "_nextIndex == %d\n", _nextIndex);
for(i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
fprintf(stderr, "channel %d : %p(%ld, %d) %d %d\n", i, _channels[i].chan, fprintf(stderr, "channel %d : %p(%ld, %d) %d %d\n", i, _channels[i].chan,
_channels[i].chan ? _channels[i].chan->getTrackIdentifier() : -1, _channels[i].chan ? _channels[i].chan->getTrackIdentifier() : -1,
_channels[i].chan ? _channels[i].chan->isTerminated() : 1, _channels[i].chan ? _channels[i].chan->isTerminated() : 1,
@ -123,7 +123,7 @@ bool ScummMixer::addChannel(_Channel * c) {
bool ScummMixer::handleFrame() { bool ScummMixer::handleFrame() {
debug(9, "ScummMixer::handleFrame()"); debug(9, "ScummMixer::handleFrame()");
for(int i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(int i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
if(_channels[i].id != -1) { if(_channels[i].id != -1) {
debug(9, "updating channel %d (%p)", _channels[i].id, _channels[i].chan); debug(9, "updating channel %d (%p)", _channels[i].id, _channels[i].chan);
if(_channels[i].chan->isTerminated()) { if(_channels[i].chan->isTerminated()) {
@ -181,7 +181,7 @@ bool ScummMixer::handleFrame() {
bool ScummMixer::stop() { bool ScummMixer::stop() {
debug(9, "ScummMixer::stop()"); debug(9, "ScummMixer::stop()");
for(int i = 0; i < SoundMixer::NUM_CHANNELS; i++) { for(int i = _mixer->_beginSlots; i < SoundMixer::NUM_CHANNELS; i++) {
if(_channels[i].id != -1) { if(_channels[i].id != -1) {
delete _channels[i].chan; delete _channels[i].chan;
_channels[i].id = -1; _channels[i].id = -1;

View file

@ -943,7 +943,7 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
if (_musicBundleToBeRemoved == true) { if (_musicBundleToBeRemoved == true) {
_scumm->_timer->releaseProcedure(&music_handler); _scumm->_timer->releaseProcedure(&music_handler);
_nameBundleMusic = NULL; _nameBundleMusic = NULL;
_scumm->_mixer->stopChannel(_bundleMusicTrack); _scumm->_mixer->stop(_bundleMusicTrack);
_bundleMusicTrack = -1; _bundleMusicTrack = -1;
if (_musicBundleBufFinal) { if (_musicBundleBufFinal) {
free(_musicBundleBufFinal); free(_musicBundleBufFinal);
@ -1033,8 +1033,8 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
uint32 final_size = decode12BitsSample(ptr, &buffer, size); uint32 final_size = decode12BitsSample(ptr, &buffer, size);
if (_bundleMusicTrack == -1) { if (_bundleMusicTrack == -1) {
_bundleMusicTrack = _scumm->_mixer->playStream(NULL, -1, buffer, final_size, rate, _bundleMusicTrack = _scumm->_mixer->playStream(NULL, _scumm->_mixer->_beginSlots - 1, buffer, final_size, rate,
SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO, -1); SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO, -1, 800000);
} else { } else {
_scumm->_mixer->append(_bundleMusicTrack, buffer, final_size, rate, _scumm->_mixer->append(_bundleMusicTrack, buffer, final_size, rate,
SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO); SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO);

View file

@ -27,6 +27,7 @@
SoundMixer::SoundMixer() { SoundMixer::SoundMixer() {
_volumeTable = (int16 *)calloc(256 * sizeof(int16), 1); _volumeTable = (int16 *)calloc(256 * sizeof(int16), 1);
_beginSlots = 0;
} }
SoundMixer::~SoundMixer() { SoundMixer::~SoundMixer() {
@ -67,7 +68,7 @@ int SoundMixer::append(int index, void * sound, uint32 size, uint rate, byte fla
int SoundMixer::insertAt(PlayingSoundHandle * handle, int index, Channel * chan) { int SoundMixer::insertAt(PlayingSoundHandle * handle, int index, Channel * chan) {
if(index == -1) { if(index == -1) {
for (int i = 0; i != NUM_CHANNELS; i++) for (int i = _beginSlots; i != NUM_CHANNELS; i++)
if (_channels[i] == NULL) { index = i; break; } if (_channels[i] == NULL) { index = i; break; }
if(index == -1) { if(index == -1) {
warning("SoundMixer::out of mixer slots"); warning("SoundMixer::out of mixer slots");
@ -85,7 +86,7 @@ int SoundMixer::insertAt(PlayingSoundHandle * handle, int index, Channel * chan)
} }
int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags) { int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags) {
for (int i = 0; i != NUM_CHANNELS; i++) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) {
if (_channels[i] == NULL) { if (_channels[i] == NULL) {
return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, -1)); return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, -1));
} }
@ -96,7 +97,7 @@ int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size,
} }
int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id) { int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id) {
for (int i = 0; i != NUM_CHANNELS; i++) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) {
if (_channels[i] == NULL) { if (_channels[i] == NULL) {
return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, id)); return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, id));
} }
@ -107,24 +108,21 @@ int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size,
} }
int SoundMixer::playStream(PlayingSoundHandle * handle, int idx, void * sound, uint32 size, int SoundMixer::playStream(PlayingSoundHandle * handle, int idx, void * sound, uint32 size,
uint rate, byte flags, int32 timeout) { uint rate, byte flags, int32 timeout, int32 buffer_size) {
return insertAt(handle, idx, new ChannelStream(this, sound, size, rate, flags, timeout)); return insertAt(handle, idx, new ChannelStream(this, sound, size, rate, flags, timeout, buffer_size));
} }
void SoundMixer::stopChannel(int index) { void SoundMixer::beginSlots(int index) {
if ((index < 0) || (index >= NUM_CHANNELS)) { if ((index < 0) && (index >= NUM_CHANNELS)) {
warning("soundMixer::stopChannel has invalid index %d", index); warning("soundMixer::beginSlots has invalid index %d", index);
return; return;
} }
_beginSlots = index;
if (_channels[index] != NULL) {
_channels[index]->_toBeDestroyed = true;
}
} }
#ifdef COMPRESSED_SOUND_FILE #ifdef COMPRESSED_SOUND_FILE
int SoundMixer::playMP3(PlayingSoundHandle * handle, void *sound, uint32 size, byte flags) { int SoundMixer::playMP3(PlayingSoundHandle * handle, void *sound, uint32 size, byte flags) {
for (int i = 0; i != NUM_CHANNELS; i++) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) {
if (_channels[i] == NULL) { if (_channels[i] == NULL) {
return insertAt(handle, i, new ChannelMP3(this, sound, size, flags)); return insertAt(handle, i, new ChannelMP3(this, sound, size, flags));
} }
@ -135,7 +133,7 @@ int SoundMixer::playMP3(PlayingSoundHandle * handle, void *sound, uint32 size, b
} }
int SoundMixer::playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration) { int SoundMixer::playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration) {
/* Stop the previously playing CD track (if any) */ /* Stop the previously playing CD track (if any) */
for (int i = 0; i != NUM_CHANNELS; i++) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) {
if (_channels[i] == NULL) { if (_channels[i] == NULL) {
return insertAt(handle, i, new ChannelMP3CDMusic(this, file, duration)); return insertAt(handle, i, new ChannelMP3CDMusic(this, file, duration));
} }
@ -201,6 +199,11 @@ void SoundMixer::stop(PlayingSoundHandle psh) {
} }
void SoundMixer::stop(int index) { void SoundMixer::stop(int index) {
if ((index < 0) || (index >= NUM_CHANNELS)) {
warning("soundMixer::stop has invalid index %d", index);
return;
}
if (_channels[index]) if (_channels[index])
_channels[index]->destroy(); _channels[index]->destroy();
} }
@ -210,7 +213,7 @@ void SoundMixer::pause(bool paused) {
} }
bool SoundMixer::hasActiveChannel() { bool SoundMixer::hasActiveChannel() {
for (int i = 0; i != NUM_CHANNELS; i++) for (int i = _beginSlots; i != NUM_CHANNELS; i++)
if (_channels[i]) if (_channels[i])
return true; return true;
return false; return false;
@ -624,10 +627,10 @@ void SoundMixer::ChannelRaw::realDestroy() {
} }
SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate,
byte flags, int32 timeout) { byte flags, int32 timeout, int32 buffer_size) {
_mixer = mixer; _mixer = mixer;
_flags = flags; _flags = flags;
_bufferSize = 2000000; _bufferSize = buffer_size;
_ptr = (byte *)malloc(_bufferSize); _ptr = (byte *)malloc(_bufferSize);
memcpy(_ptr, sound, size); memcpy(_ptr, sound, size);
_endOfData = _ptr + size; _endOfData = _ptr + size;

View file

@ -85,7 +85,7 @@ private:
byte _flags; byte _flags;
public: public:
ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int32 timout); ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int32 timout, int32 buffer_size);
void append(void * sound, uint32 size); void append(void * sound, uint32 size);
void mix(int16 * data, uint len); void mix(int16 * data, uint len);
@ -163,12 +163,15 @@ public:
Channel * _channels[NUM_CHANNELS]; Channel * _channels[NUM_CHANNELS];
PlayingSoundHandle * _handles[NUM_CHANNELS]; PlayingSoundHandle * _handles[NUM_CHANNELS];
int _beginSlots;
SoundMixer(); SoundMixer();
~SoundMixer(); ~SoundMixer();
int insertAt(PlayingSoundHandle * handle, int index, Channel * chan); int insertAt(PlayingSoundHandle * handle, int index, Channel * chan);
void append(void * data, uint32 len); void append(void * data, uint32 len);
void unInsert(Channel * chan); void unInsert(Channel * chan);
void beginSlots(int index);
/* start playing a raw sound */ /* start playing a raw sound */
enum { enum {
@ -183,8 +186,7 @@ public:
int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags); int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags);
int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id); int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id);
int playStream(PlayingSoundHandle * handle, int index, void * sound, uint32 size, uint rate, int playStream(PlayingSoundHandle * handle, int index, void * sound, uint32 size, uint rate,
byte flags, int32 timeout = 3); byte flags, int32 timeout = 3, int32 buffer_size = 2000000);
void stopChannel(int index);
#ifdef COMPRESSED_SOUND_FILE #ifdef COMPRESSED_SOUND_FILE
int playMP3(PlayingSoundHandle * handle, void * sound, uint32 size, byte flags); int playMP3(PlayingSoundHandle * handle, void * sound, uint32 size, byte flags);
int playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration); int playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration);