AudioStream *makeLoopingAudioStream(SeekableAudioStream *stream, Timestamp start, Timestamp end, uint loops) { if (!start.totalNumberOfFrames() && (!end.totalNumberOfFrames() || end == stream->getLength())) { return makeLoopingAudioStream(stream, loops); } else { if (!end.totalNumberOfFrames()) end = stream->getLength(); if (start >= end) { warning("makeLoopingAudioStream: start (%d) >= end (%d)", start.msecs(), end.msecs()); delete stream; return 0; } return makeLoopingAudioStream(new SubSeekableAudioStream(stream, start, end), loops); } }
ChannelHandle SoundManager::playSoundFile(Common::SeekableReadStream *wavStream, SoundType type, bool loop) { checkReady(); if (!wavStream) throw Common::Exception("No stream"); AudioStream *audioStream = makeAudioStream(wavStream); if (loop) { RewindableAudioStream *reAudStream = dynamic_cast<RewindableAudioStream *>(audioStream); if (!reAudStream) warning("SoundManager::playSoundFile(): The input stream cannot be rewound, this will not loop."); else audioStream = makeLoopingAudioStream(reAudStream, 0); } return playAudioStream(audioStream, type); }