public static int APPFrequency(Int64 Hwnd, List <HwndBuffer> hwndbuffer) { HwndBuffer b = Search(Hwnd, hwndbuffer); if (b != null) { return(b.Value()); } else { //még nincs a bufferben tároljuk el b = new HwndBuffer(Hwnd, hwndbuffer); return(b.counter); } }
public static int APPStep(Int64 Hwnd, List <HwndBuffer> hwndbuffer) //amikor találunk korábbi eltárolt buffer adatot { HwndBuffer b = Search(Hwnd, hwndbuffer); if (b != null) { return(b.Increment()); } else { //még nincs a bufferben tároljuk el b = new HwndBuffer(Hwnd, hwndbuffer); return(b.counter); } }
// return kétbyte-os tömb első bájt a mód, második a letárolási index public byte[] indexOfBufferAndStore(string Owner, string hash, byte[] mem, Int64 Hwnd) { byte[] ret = new byte[2]; MediaBuffer buf = null, old = null; byte oldi = 0; int index = -1; DateTime olddt = DateTime.Now; store.WaitOne(); byte cnt = (byte)SIBuffer.Count(); for (byte i = 0; i < cnt; i++) { buf = SIBuffer[i]; if (buf.owner.CompareTo(Owner) == 0) { if (buf.hwnd.CompareTo(Hwnd) == 0) { index = i; } //Talált adatot az adott HWND-hez, azaz olyat ami nem egyezik de ehhet az ablakhoz köthető korábbi if (buf.key.CompareTo(hash) == 0) { ret[0] = VRMainContentExporter.VRCEShared.CONST_MODE_BFFOUND; ret[1] = i; buf.created = DateTime.Now; //még ha nem is kell tenni semmit sem.. az uptodate ez a frame lesz. Lekérdezés ez alapján működik legfrissebb = aktuális frame buf.usage++; HwndBuffer.APPStep(Hwnd, hwndbuffer); store.Release(); return(ret); //Megtalálta a megfelelő buffer elemet, sem hozzádás, sem módosítás nem történt } } if ((olddt > buf.created) || (buf.del)) //TODO BUF.DEL előkészülve ha lesz process ami kitölti... { olddt = buf.created; old = buf; oldi = i; //A legrégebbi buffer elem } } //új felvétele - ha idáig eljutottunk, akkor nem találtuk meg int freq = HwndBuffer.APPFrequency(Hwnd, hwndbuffer); // 1 érték azt jelenti minden alkalommal ha HWND adat jön az új, 2 azt jelenti minden második alkalommal új... if ((index < 0) || (cnt < 1) || (freq > 1)) // cnt=0 akkor ADD lesz (azaz üres a buffer), // index = vagy ha nincs a bufferben az ablakhoz régi elem. akkor sem lehet arra ráülni újra // { if (cnt >= CONST_MAXBUFF) { // ha tele a buffer akkor a legrégebbi törlése MediaBuffer.Modify(old, Owner, hash, mem, Hwnd); ret[0] = VRMainContentExporter.VRCEShared.CONST_MODE_BFMODIFY; ret[1] = oldi; // A legrégebbi buffer elemre hivatkozás módosításra store.Release(); return(ret); } else { SIBuffer.Add(new MediaBuffer(Owner, hash, mem, Hwnd)); SIX++; ret[0] = VRMainContentExporter.VRCEShared.CONST_MODE_BFADD; ret[1] = (byte)(SIX - 1); // Van még hely új elem részére felvesszük store.Release(); return(ret); } } else { // A bufferben vannak elemek már, // az adott ablakhoz tartozik már elem // Az ismétlési freq (1) alacsony, azaz minden frame más és más és ezzel nem terheljük a buffert // módosítjuk a gyorsan változó tartalmú ablak adatát a bufferben MediaBuffer.Modify(SIBuffer[index], Owner, hash, mem, Hwnd); ret[0] = VRMainContentExporter.VRCEShared.CONST_MODE_BFMODIFY; ret[1] = (byte)index; store.Release(); return(ret); } }