handle case where SetNextAVTransportURI fails
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user