login

<     >

2021-02-02 00:55:41 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

added player-friendly API (load/seek/play)

diff --git a/qms.c b/qms.c
index 4ccc348..abf73bc 100644
--- a/qms.c
+++ b/qms.c
@@ -211,3 +211,42 @@ qms_runevents(Event *evs, unsigned int nevs)
             break;
     }
 }
+
+void
+qms_load(Seeker *seeker, Event *evs, unsigned int nevs)
+{
+    seeker->evs = evs;
+    seeker->nevs = nevs;
+    seeker->ev_i = 0;
+    seeker->smp_i = 0;
+}
+
+void
+qms_seek(Seeker *seeker, unsigned int nsamples)
+{
+    for (seeker->ev_i = 0; seeker->ev_i < seeker->nevs; seeker->ev_i++) {
+        if (seeker->evs[seeker->ev_i].offset > nsamples)
+            break;
+        qms_runevent(&seeker->evs[seeker->ev_i]);
+    }
+    seeker->smp_i = nsamples;
+}
+
+int
+qms_play(Seeker *seeker, unsigned int nsamples)
+{
+    unsigned int nadv;
+    while (seeker->smp_i + nsamples >= seeker->evs[seeker->ev_i].offset) {
+        nadv = seeker->evs[seeker->ev_i].offset - seeker->smp_i;
+        qms_advance(nadv);
+        qms_runevent(&seeker->evs[seeker->ev_i]);
+        seeker->ev_i++;
+        if (seeker->ev_i == seeker->nevs)
+            return 1;
+        nsamples -= nadv;
+        seeker->smp_i += nadv;
+    }
+    qms_advance(nsamples);
+    seeker->smp_i += nsamples;
+    return 0;
+}

diff --git a/qms.h b/qms.h
index 6a63eb0..1a359b7 100644
--- a/qms.h
+++ b/qms.h
@@ -22,6 +22,13 @@ typedef struct Event {
     uint32_t event;
 } Event;
 
+typedef struct Seeker {
+    Event *evs;
+    unsigned int nevs;
+    unsigned int ev_i;
+    unsigned int smp_i;
+} Seeker;
+
 #define qms_ev_pac(t, pac)      (((t) << 28) | (PAC << 16) | (pac))
 #define qms_ev_vol(t, vol)      (((t) << 28) | (VOL << 16) | (vol))
 #define qms_ev_pan(t, pan)      (((t) << 28) | (PAN << 16) | (pan))
@@ -39,6 +46,9 @@ void qms_setwheel(int track, int voice, int wheel);
 void qms_advance(unsigned int nsamples);
 int  qms_runevent(Event *ev);
 void qms_runevents(Event *evs, unsigned int nevs);
+void qms_load(Seeker *seeker, Event *evs, unsigned int nevs);
+void qms_seek(Seeker *seeker, unsigned int nsamples);
+int  qms_play(Seeker *seeker, unsigned int nsamples);
 void qms_putsample(int16_t left, int16_t right);
 
 #endif /* QMS_H */