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 */