Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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));
            }
        }
Ejemplo n.º 7
0
 public static bool Seek(this ISeekableAudioStream stream, int where)
 {
     return(stream.Seek(new Timestamp(where, stream.Rate)));
 }