aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2009-03-06 07:25:15 +0000
committerMax Horn2009-03-06 07:25:15 +0000
commitf8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0 (patch)
treec19aebd2e3cf1763e1324405330cdaa6ec3d0788
parent5e2ee01b39392eecd966624e1d0efc75ee41bc10 (diff)
downloadscummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.tar.gz
scummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.tar.bz2
scummvm-rg350-f8d9e4fdcc6bc2e3eab60b69cb31be070fed73d0.zip
SCI: Restructured PolledPlayerAudioStream::readBuffer a bit
svn-id: r39149
-rw-r--r--engines/sci/sfx/player/polled.cpp38
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;