handle case where SetNextAVTransportURI fails

This commit is contained in:
Drew Weymouth
2025-03-29 15:15:13 -07:00
parent e4c187b4df
commit 379309c27f
+39 -6
View File
@@ -66,6 +66,14 @@ type DLNAPlayer struct {
proxyURLs [3]proxyMapEntry proxyURLs [3]proxyMapEntry
proxyURLLock sync.Mutex 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 timerActive atomic.Bool
timer *time.Timer timer *time.Timer
resetChan chan (time.Duration) resetChan chan (time.Duration)
@@ -117,11 +125,7 @@ func (d *DLNAPlayer) PlayFile(urlstr string, meta mediaprovider.MediaItemMetadat
Title: meta.Name, Title: meta.Name,
} }
err := d.avTransport.SetAVTransportMedia(context.Background(), &media) if err := d.playAVTransportMedia(&media); err != nil {
if err != nil {
return err
}
if err := d.avTransport.Play(context.Background()); err != nil {
return err return err
} }
d.state = playing d.state = playing
@@ -134,6 +138,17 @@ func (d *DLNAPlayer) PlayFile(urlstr string, meta mediaprovider.MediaItemMetadat
return nil 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 { func (d *DLNAPlayer) SetNextFile(url string, meta mediaprovider.MediaItemMetadata) error {
var media *avtransport.MediaItem var media *avtransport.MediaItem
d.metaLock.Lock() d.metaLock.Lock()
@@ -148,7 +163,14 @@ func (d *DLNAPlayer) SetNextFile(url string, meta mediaprovider.MediaItemMetadat
Title: meta.Name, 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 { func (d *DLNAPlayer) Continue() error {
@@ -325,6 +347,17 @@ func (d *DLNAPlayer) handleOnTrackChange() {
d.stopwatch.Reset() d.stopwatch.Reset()
d.InvokeOnStopped() d.InvokeOnStopped()
} else { } 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.lastStartTime = 0
d.stopwatch.Reset() d.stopwatch.Reset()
d.stopwatch.Start() d.stopwatch.Start()