Beispiel #1
0
        public OggOpusFile(Stream sourceStream, bool leaveOpen = false)
        {
            if (sourceStream == null || !sourceStream.CanRead)
            {
                throw new ArgumentException("fileStream must be a readable stream.");
            }
            _sourceStream = sourceStream;
            _leaveOpen    = leaveOpen;

            _read = new ReadFunc(ReadCallback);
            _seek = new SeekFunc(SeekCallback);
            _tell = new TellFunc(TellCallback);

            var cb = new _OpusFileCallbacks()
            {
                read  = Marshal.GetFunctionPointerForDelegate(_read),
                seek  = _sourceStream.CanSeek ? Marshal.GetFunctionPointerForDelegate(_seek) : IntPtr.Zero,
                tell  = _sourceStream.CanSeek ? Marshal.GetFunctionPointerForDelegate(_tell) : IntPtr.Zero,
                close = IntPtr.Zero,
            };

            _handle = (IntPtr)this.GetHashCode();
            lock (_streams) {
                _streams.Add(_handle, this);
            }

            OpusError error;

            _opusFile = op_open_callbacks(_handle, ref cb, IntPtr.Zero, IntPtr.Zero, out error);
            if (_opusFile == IntPtr.Zero)
            {
                throw new OpusException(error);
            }
        }
Beispiel #2
0
        /// <summary><para>
        /// Calls `fn` for each sub-node (in order of their appearance in source code),
        /// short-circuits and returns `true` if the function returns `true` for any node.
        /// </para><para>
        /// If provided, `st` maintains a stack/history of nested nodes, allowing to check for parents in `fn`
        /// </para></summary>
        public bool seek(SeekFunc fn, List <Node> st = null)
        {
            if (st != null)
            {
                st.Insert(0, this);
            }
            var result = seekRec(fn, st);

            if (st != null)
            {
                st.RemoveAt(0);
            }
            return(result);
        }
Beispiel #3
0
 protected override bool seekRec(SeekFunc fn, List <Node> st)
 {
     for (var i = 0; i < nodes.Count; i++)
     {
         // this nonsense is dedicated to CS0206
         var node = nodes[i];
         var z    = fn(ref node, st);
         nodes[i] = node;
         if (z)
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #4
0
        protected bool seekList(List <Node> list, SeekFunc fn, List <Node> st)
        {
            var n = list.Count;

            for (var i = 0; i < n; i++)
            {
                // this nonsense is dedicated to CS0206
                var node  = list[i];
                var found = fn(ref node, st);
                list[i] = node;
                if (found)
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #5
0
        public OggOpusFile(Stream sourceStream, bool leaveOpen = false)
        {
            if (sourceStream == null || !sourceStream.CanRead)
                throw new ArgumentException("fileStream must be a readable stream.");
            _sourceStream = sourceStream;
            _leaveOpen = leaveOpen;

            _read = new ReadFunc(ReadCallback);
            _seek = new SeekFunc(SeekCallback);
            _tell = new TellFunc(TellCallback);

            var cb = new _OpusFileCallbacks() {
                read = Marshal.GetFunctionPointerForDelegate(_read),
                seek = _sourceStream.CanSeek ? Marshal.GetFunctionPointerForDelegate(_seek) : IntPtr.Zero,
                tell = _sourceStream.CanSeek ? Marshal.GetFunctionPointerForDelegate(_tell) : IntPtr.Zero,
                close = IntPtr.Zero,
            };

            OpusError error;
            _opusFile = op_open_callbacks(IntPtr.Zero, ref cb, IntPtr.Zero, IntPtr.Zero, out error);
            if (_opusFile == IntPtr.Zero)
                throw new OpusException(error);
        }
Beispiel #6
0
 protected override bool seekRec(SeekFunc fn, List <Node> st) => value != null && fn(ref value, st);
Beispiel #7
0
 protected override bool seekRec(SeekFunc fn, List <Node> st)
 {
     return(fn(ref loop, st) || fn(ref cond, st));
 }
Beispiel #8
0
 /// Should call fn with each of inner nodes, stopping if any return `true`.
 protected virtual bool seekRec(SeekFunc fn, List <Node> st) => false;
Beispiel #9
0
 protected override bool seekRec(SeekFunc fn, List <Node> st)
 {
     return(fn(ref @if, st) || fn(ref then, st) || (@else != null && fn(ref @else, st)));
 }
Beispiel #10
0
 protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref node, st) || seekList(args, fn, st);
Beispiel #11
0
 protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref node, st) || fn(ref index, st);
Beispiel #12
0
 protected override bool seekRec(SeekFunc fn, List <Node> st) => seekList(values, fn, st);
Beispiel #13
0
 protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref left, st) || fn(ref right, st);