int Player_AD::readBuffer(int16 *buffer, const int numSamples) { Common::StackLock lock(_mutex); int len = numSamples; while (len > 0) { if (!_samplesTillCallback) { if (_curOffset) { updateMusic(); } updateSfx(); _samplesTillCallback = _samplesPerCallback; _samplesTillCallbackRemainder += _samplesPerCallbackRemainder; if (_samplesTillCallbackRemainder >= AD_CALLBACK_FREQUENCY) { ++_samplesTillCallback; _samplesTillCallbackRemainder -= AD_CALLBACK_FREQUENCY; } } const int samplesToRead = MIN(len, _samplesTillCallback); _opl2->readBuffer(buffer, samplesToRead); buffer += samplesToRead; len -= samplesToRead; _samplesTillCallback -= samplesToRead; } return numSamples; }
void CUP_Player::play() { while (parseNextHeaderTag(_fileStream)) { } if (_fileStream.eos() || _fileStream.err()) return; debug(1, "rate %d width %d height %d", _playbackRate, _width, _height); int ticks = _system->getMillis(); while (_dataSize != 0 && !_vm->shouldQuit()) { while (parseNextBlockTag(_fileStream)) { } if (_fileStream.eos() || _fileStream.err()) return; int diff = _system->getMillis() - ticks; if (diff >= 0 && diff <= _playbackRate) { _system->delayMillis(_playbackRate - diff); } else { _system->delayMillis(1); } updateSfx(); updateScreen(); _vm->parseEvents(); ticks = _system->getMillis(); } }
void Player_AD::onTimer() { Common::StackLock lock(_mutex); if (_curOffset) { updateMusic(); } updateSfx(); }