unsafe int FrameAcceptedCallback(S2Frame *frm) { if (frm->Error != 0 || frm->Width == 0 || frm->Height == 0) { return(0); } if (FrameAccepted == null) { SnvBackend.FreeFrame(frm); return(0); } AppTools.TryInvoke(() => { bool changed = false; if (bitmap == null || bitmap.Width != frm->Width || bitmap.Height != frm->Height) { bitmap = new WriteableBitmap(frm->Width, frm->Height, 96, 96, PixelFormats.Bgr24, null); changed = true; } unsafe { bitmap.Lock(); UnmanagedTools.CopyMemory(bitmap.BackBuffer, frm->Pixels, (uint)(frm->Height * bitmap.BackBufferStride)); bitmap.AddDirtyRect(new Int32Rect(0, 0, frm->Width, frm->Height)); bitmap.Unlock(); SnvBackend.FreeFrame(frm); } FrameAccepted?.Invoke(this, new FrameAcceptedEventArgs(bitmap, changed)); }); return(0); }
void RecorderThread() { Dictionary <int, IntPtr> contexts = new Dictionary <int, IntPtr>(); while (running && IsApplicationRunning) { unsafe { try { var displays = SnvBackend.ScrCountDisplays(); if (displays < 0) { throw new Exception("Cannot count the displays available"); } for (int i = 0; i < displays; i++) { var ptr = Marshal.AllocHGlobal(sizeof(RecorderContext)); UnmanagedTools.SetMemory(ptr, 0, sizeof(RecorderContext)); contexts.Add(i, ptr); } while (running && IsApplicationRunning) { foreach (var k in contexts.Keys) { S2Frame frmRaw; if (SnvBackend.ScrCapture(&frmRaw, k, 1) != 0) { break; } SnvBackend.RecCommitFrame((RecorderContext *)contexts[k], &frmRaw, k); SnvBackend.FreeFrame(&frmRaw); } Thread.Sleep(25); } } catch { } try { SnvBackend.RecStop(); foreach (var k in contexts.Keys) { SnvBackend.RecCommitFrame((RecorderContext *)contexts[k], null, k); Marshal.FreeHGlobal(contexts[k]); } contexts.Clear(); } catch { } } Thread.Sleep(250); } }