commit 54d36e7969249bef53db07591ffd595cc19bcd05
parent 8b40d468a0c715b6d0ad4b18fa6b6e6bbb531d78
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date: Fri, 5 Jan 2024 18:23:20 +0800
internal: TriggerReader
This type triggers a callback when it's internal Reader hits EOF.
This is useful with ebitengine/oto/v3 because it doesn't provide a nice
way to detect end of playback.
Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Diffstat:
1 file changed, 27 insertions(+), 0 deletions(-)
diff --git a/internal/trigger-reader.go b/internal/trigger-reader.go
@@ -0,0 +1,27 @@
+package internal
+
+import "io"
+
+// TriggerReader invokes a callback when EOF is reached.
+type TriggerReader struct {
+ r io.Reader
+ cb func()
+}
+
+func NewTriggerReader(src io.Reader, cb func()) *TriggerReader {
+ return &TriggerReader{r: src, cb: cb}
+}
+
+func (t *TriggerReader) Read(p []byte) (n int, err error) {
+ n, err = t.r.Read(p)
+ if err == io.EOF {
+ t.Callback()
+ }
+ return n, err
+}
+
+func (t *TriggerReader) Callback() {
+ if t.cb != nil {
+ t.cb()
+ }
+}