fix(jukebox): make sure we clean up "seekable" event listener
related #411
This commit is contained in:
@@ -38,7 +38,6 @@ func MPVArg(k string, v any) string {
|
|||||||
type Jukebox struct {
|
type Jukebox struct {
|
||||||
cmd *exec.Cmd
|
cmd *exec.Cmd
|
||||||
conn *mpvipc.Connection
|
conn *mpvipc.Connection
|
||||||
events <-chan *mpvipc.Event
|
|
||||||
|
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
}
|
}
|
||||||
@@ -87,7 +86,6 @@ func (j *Jukebox) Start(sockPath string, mpvExtraArgs []string) error {
|
|||||||
if _, err := j.conn.Call("observe_property", 0, "seekable"); err != nil {
|
if _, err := j.conn.Call("observe_property", 0, "seekable"); err != nil {
|
||||||
return fmt.Errorf("observe property: %w", err)
|
return fmt.Errorf("observe property: %w", err)
|
||||||
}
|
}
|
||||||
j.events, _ = j.conn.NewEventListener()
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -205,21 +203,25 @@ func (j *Jukebox) SkipToPlaylistIndex(i int, offsetSecs int) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ch, stop := j.conn.NewEventListener()
|
||||||
|
defer close(stop)
|
||||||
|
|
||||||
if _, err := j.conn.Call("playlist-play-index", i); err != nil {
|
if _, err := j.conn.Call("playlist-play-index", i); err != nil {
|
||||||
return fmt.Errorf("playlist play index: %w", err)
|
return fmt.Errorf("playlist play index: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if offsetSecs > 0 {
|
if offsetSecs > 0 {
|
||||||
if err := waitFor(j.events, matchEventSeekable); err != nil {
|
if err := waitFor(ch, matchEventSeekable); err != nil {
|
||||||
return fmt.Errorf("waiting for file load: %w", err)
|
return fmt.Errorf("waiting for file load: %w", err)
|
||||||
}
|
}
|
||||||
if _, err := j.conn.Call("seek", offsetSecs, "absolute"); err != nil {
|
if _, err := j.conn.Call("seek", offsetSecs, "absolute"); err != nil {
|
||||||
return fmt.Errorf("seek: %w", err)
|
return fmt.Errorf("seek: %w", err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := j.conn.Set("pause", false); err != nil {
|
if err := j.conn.Set("pause", false); err != nil {
|
||||||
return fmt.Errorf("play: %w", err)
|
return fmt.Errorf("play: %w", err)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,8 +372,6 @@ func waitFor[T any](ch <-chan T, match func(e T) bool) error {
|
|||||||
quit := time.NewTicker(1 * time.Second)
|
quit := time.NewTicker(1 * time.Second)
|
||||||
defer quit.Stop()
|
defer quit.Stop()
|
||||||
|
|
||||||
defer time.Sleep(350 * time.Millisecond)
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-quit.C:
|
case <-quit.C:
|
||||||
|
|||||||
Reference in New Issue
Block a user