diff options
author | Max Horn | 2009-03-06 07:25:15 +0000 |
---|---|---|
committer | Max Horn | 2009-03-06 07:25:15 +0000 |
commit | f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0 (patch) | |
tree | c19aebd2e3cf1763e1324405330cdaa6ec3d0788 /engines/sci | |
parent | 5e2ee01b39392eecd966624e1d0efc75ee41bc10 (diff) | |
download | scummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.tar.gz scummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.tar.bz2 scummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.zip |
SCI: Restructured PolledPlayerAudioStream::readBuffer a bit
svn-id: r39149
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/sfx/player/polled.cpp | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/engines/sci/sfx/player/polled.cpp b/engines/sci/sfx/player/polled.cpp index f11315bfe8..1824393c46 100644 --- a/engines/sci/sfx/player/polled.cpp +++ b/engines/sci/sfx/player/polled.cpp @@ -149,15 +149,14 @@ int PolledPlayerAudioStream::readBuffer(int16 *buffer, const int numSamples) { // timestamp could be adjusted for pauses in sound processing. And it would // be synced for all audio streams. Audio::Timestamp timestamp(g_system->getMillis(), _conf.rate); + _time = timestamp; - int channels, frames_req; + const int channels = _conf.stereo == SFX_PCM_MONO ? 1 : 2; + const int frames_req = numSamples / channels; int frames_recv = 0; - _time = timestamp; - channels = _conf.stereo == SFX_PCM_MONO ? 1 : 2; - frames_req = numSamples / channels; - while (frames_req != frames_recv) { + int frames = 0; int frames_left = frames_req - frames_recv; byte *buf_pos = ((byte *)buffer) + frames_recv * channels * 2; @@ -165,35 +164,26 @@ int PolledPlayerAudioStream::readBuffer(int16 *buffer, const int numSamples) { queryTimestamp(); if (_mode == FEED_MODE_IDLE) { - memset(buf_pos, 0, frames_left * channels * 2); - - _time = _time.addFrames(frames_left); - break; - } - - if (_gap) { - int frames = _gap; - - if (frames > frames_left) - frames = frames_left; - + frames = frames_left; memset(buf_pos, 0, frames * channels * 2); + } else if (_gap) { + frames = MIN(_gap, frames_left); _gap -= frames; - frames_recv += frames; - _time = _time.addFrames(frames); + memset(buf_pos, 0, frames * channels * 2); + } else { - int frames = ppf_poll(channels * ((_conf.format & SFX_PCM_FORMAT_16) ? 2 : 1), buf_pos, frames_left); + frames = ppf_poll(channels * ((_conf.format & SFX_PCM_FORMAT_16) ? 2 : 1), buf_pos, frames_left); if (_conf.format == SFX_PCM_FORMAT_U8) U8_to_S16(buf_pos, frames * channels); - frames_recv += frames; - _time = _time.addFrames(frames); - if (frames < frames_left) - queryTimestamp(); + _mode = FEED_MODE_IDLE; } + + frames_recv += frames; + _time = _time.addFrames(frames); } return numSamples; |