public SubSeekableAudioStream(ISeekableAudioStream parent, Timestamp start, Timestamp end, bool disposeAfterUse = true) { _parent = parent; _disposeAfterUse = disposeAfterUse; _start = AudioStreamHelper.ConvertTimeToStreamPos(start, Rate, IsStereo); _pos = new Timestamp(0, Rate * (IsStereo ? 2 : 1)); _length = AudioStreamHelper.ConvertTimeToStreamPos(end, Rate, IsStereo) - _start; Debug.Assert(_length.TotalNumberOfFrames % (IsStereo ? 2 : 1) == 0); _parent.Seek(_start); }
public SubSeekableAudioStream(ISeekableAudioStream parent, Timestamp start, Timestamp end, bool disposeAfterUse = true) { _parent = parent; _disposeAfterUse = disposeAfterUse; _start = AudioStreamHelper.ConvertTimeToStreamPos(start, Rate, IsStereo); _pos = new Timestamp(0, Rate * (IsStereo ? 2 : 1)); _length = AudioStreamHelper.ConvertTimeToStreamPos(end, Rate, IsStereo) - _start; Debug.Assert(_length.TotalNumberOfFrames % (IsStereo ? 2 : 1) == 0); _parent.Seek(_start); }
public void Play(int track, int numLoops, int startFrame, int duration, bool only_emulate) { if (numLoops != 0 || startFrame != 0) { _cd.track = track; _cd.numLoops = numLoops; _cd.start = startFrame; _cd.duration = duration; // Try to load the track from a compressed data file, and if found, use // that. If not found, attempt to start regular Audio CD playback of // the requested track. string[] trackName = new string[2]; trackName[0] = string.Format("track{0}", track); trackName[1] = string.Format("track{0:00}", track); ISeekableAudioStream stream = null; var directory = ServiceLocator.FileStorage.GetDirectoryName(_vm.Game.Path); for (int i = 0; stream == null && i < 2; ++i) { var path = ScummHelper.LocatePath(directory, trackName[i]); if (path != null) { // TODO: open stream } } // Stop any currently playing emulated track _mixer.StopHandle(_handle); if (stream != null) { var start = new Timestamp(0, startFrame, 75); var end = duration != 0 ? new Timestamp(0, startFrame + duration, 75) : stream.Length; /* * FIXME: Seems numLoops == 0 and numLoops == 1 both indicate a single repetition, * while all other positive numbers indicate precisely the number of desired * repetitions. Finally, -1 means infinitely many */ _emulating = true; _handle = _mixer.PlayStream(SoundType.Music, LoopingAudioStream.Create(stream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops), -1, _cd.volume, _cd.balance); } else { _emulating = false; if (!only_emulate) { PlayCD(track, numLoops, startFrame, duration); } } } }
public SubLoopingAudioStream(ISeekableAudioStream stream, uint loops, Timestamp loopStart, Timestamp loopEnd, bool disposeAfterUse = true) { _parent = stream; _loops = loops; _pos = new Timestamp(0, Rate * (IsStereo ? 2 : 1)); _loopStart = AudioStreamHelper.ConvertTimeToStreamPos(loopStart, Rate, IsStereo); _loopEnd = AudioStreamHelper.ConvertTimeToStreamPos(loopEnd, Rate, IsStereo); _done = false; Debug.Assert(loopStart < loopEnd); if (!_parent.Rewind()) _done = true; }
public SubLoopingAudioStream(ISeekableAudioStream stream, uint loops, Timestamp loopStart, Timestamp loopEnd, bool disposeAfterUse = true) { _parent = stream; _loops = loops; _pos = new Timestamp(0, Rate * (IsStereo ? 2 : 1)); _loopStart = AudioStreamHelper.ConvertTimeToStreamPos(loopStart, Rate, IsStereo); _loopEnd = AudioStreamHelper.ConvertTimeToStreamPos(loopEnd, Rate, IsStereo); _done = false; Debug.Assert(loopStart < loopEnd); if (!_parent.Rewind()) { _done = true; } }
public static LoopingAudioStream Create(ISeekableAudioStream stream, Timestamp start, Timestamp end, int loops) { if (start.TotalNumberOfFrames == 0 && (end.TotalNumberOfFrames == 0 || end == stream.Length)) { return(new LoopingAudioStream(stream, loops)); } else { if (end.TotalNumberOfFrames == 0) { end = stream.Length; } if (start >= end) { Debug.WriteLine("makeLoopingAudioStream: start ({0}) >= end ({1})", start.Milliseconds, end.Milliseconds); stream.Dispose(); return(null); } return(new LoopingAudioStream(new SubSeekableAudioStream(stream, start, end), loops)); } }
public static bool Seek(this ISeekableAudioStream stream, int where) { return(stream.Seek(new Timestamp(where, stream.Rate))); }