From 379309c27f933d9582ec991c7771a6b4cd7267d2 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 20 Mar 2025 19:52:26 -0700 Subject: [PATCH] handle case where SetNextAVTransportURI fails --- backend/player/dlna/dlnaplayer.go | 45 ++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/backend/player/dlna/dlnaplayer.go b/backend/player/dlna/dlnaplayer.go index 3127f8d..5bbca30 100644 --- a/backend/player/dlna/dlnaplayer.go +++ b/backend/player/dlna/dlnaplayer.go @@ -66,6 +66,14 @@ type DLNAPlayer struct { proxyURLs [3]proxyMapEntry proxyURLLock sync.Mutex + // If SetNextAVTransport fails (e.g. because the device + // does not support the API/gapless), this flag is set + // true, and the next firing of the track change timer + // should clear it to false and use SetAVTransport + // to begin playing the item in nextTrackMeta. + failedToSetNext bool + unsetNextMediaItem *avtransport.MediaItem + timerActive atomic.Bool timer *time.Timer resetChan chan (time.Duration) @@ -117,11 +125,7 @@ func (d *DLNAPlayer) PlayFile(urlstr string, meta mediaprovider.MediaItemMetadat Title: meta.Name, } - err := d.avTransport.SetAVTransportMedia(context.Background(), &media) - if err != nil { - return err - } - if err := d.avTransport.Play(context.Background()); err != nil { + if err := d.playAVTransportMedia(&media); err != nil { return err } d.state = playing @@ -134,6 +138,17 @@ func (d *DLNAPlayer) PlayFile(urlstr string, meta mediaprovider.MediaItemMetadat return nil } +func (d *DLNAPlayer) playAVTransportMedia(media *avtransport.MediaItem) error { + err := d.avTransport.SetAVTransportMedia(context.Background(), media) + if err != nil { + return err + } + if err := d.avTransport.Play(context.Background()); err != nil { + return err + } + return nil +} + func (d *DLNAPlayer) SetNextFile(url string, meta mediaprovider.MediaItemMetadata) error { var media *avtransport.MediaItem d.metaLock.Lock() @@ -148,7 +163,14 @@ func (d *DLNAPlayer) SetNextFile(url string, meta mediaprovider.MediaItemMetadat Title: meta.Name, } } - return d.avTransport.SetNextAVTransportMedia(context.Background(), media) + err := d.avTransport.SetNextAVTransportMedia(context.Background(), media) + if err != nil { + d.metaLock.Lock() + d.failedToSetNext = true + d.unsetNextMediaItem = media + d.metaLock.Unlock() + } + return err } func (d *DLNAPlayer) Continue() error { @@ -325,6 +347,17 @@ func (d *DLNAPlayer) handleOnTrackChange() { d.stopwatch.Reset() d.InvokeOnStopped() } else { + d.metaLock.Lock() + if d.failedToSetNext { + d.failedToSetNext = false + media := d.unsetNextMediaItem + d.unsetNextMediaItem = nil + d.metaLock.Unlock() + d.playAVTransportMedia(media) + } else { + d.metaLock.Unlock() + } + d.lastStartTime = 0 d.stopwatch.Reset() d.stopwatch.Start()