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); } }
/// <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); }
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); }
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); }
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); }
protected override bool seekRec(SeekFunc fn, List <Node> st) => value != null && fn(ref value, st);
protected override bool seekRec(SeekFunc fn, List <Node> st) { return(fn(ref loop, st) || fn(ref cond, st)); }
/// Should call fn with each of inner nodes, stopping if any return `true`. protected virtual bool seekRec(SeekFunc fn, List <Node> st) => false;
protected override bool seekRec(SeekFunc fn, List <Node> st) { return(fn(ref @if, st) || fn(ref then, st) || (@else != null && fn(ref @else, st))); }
protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref node, st) || seekList(args, fn, st);
protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref node, st) || fn(ref index, st);
protected override bool seekRec(SeekFunc fn, List <Node> st) => seekList(values, fn, st);
protected override bool seekRec(SeekFunc fn, List <Node> st) => fn(ref left, st) || fn(ref right, st);