Compare commits

...

2 commits

Author SHA1 Message Date
d2025102e6 warn on failed seek 2024-10-20 13:35:15 +02:00
26449b9dcf this should be better than inc_position 2024-10-20 13:32:15 +02:00

View file

@ -43,9 +43,6 @@ public class Playbin : GLib.Object {
// signalled when the last track is over // signalled when the last track is over
public signal void stopped (); public signal void stopped ();
// set to false when manually switching tracks
private bool inc_position;
// these are mostly synced with mpv // these are mostly synced with mpv
public double position { get; private set; default = 0.0; } public double position { get; private set; default = 0.0; }
public double duration { get; private set; default = 0.0; } public double duration { get; private set; default = 0.0; }
@ -143,11 +140,6 @@ public class Playbin : GLib.Object {
case Mpv.EventId.START_FILE: case Mpv.EventId.START_FILE:
debug ("START_FILE received"); debug ("START_FILE received");
if (this.inc_position) {
this.play_queue_position += 1;
} else {
this.inc_position = true;
}
// estimate duration from api data // estimate duration from api data
// while mpv doesn't know it // while mpv doesn't know it
@ -157,17 +149,22 @@ public class Playbin : GLib.Object {
break; break;
case Mpv.EventId.END_FILE: case Mpv.EventId.END_FILE:
debug ("END_FILE received");
var data = event.parse_end_file (); var data = event.parse_end_file ();
debug (@"END_FILE received (reason: $(data.reason))");
if (data.error < 0) { if (data.error < 0) {
warning ("playback of track aborted: %s", data.error.to_string ()); warning ("playback of track aborted: %s", data.error.to_string ());
} }
if (this.inc_position && this.play_queue_position+1 == this._play_queue.get_n_items ()) { if (data.reason == Mpv.EndFileReason.EOF) {
// reached the end (?) // assume this is a proper transition
this.play_queue_position += 1; this.play_queue_position += 1;
this.state = PlaybinState.STOPPED;
this.stopped (); if (this.play_queue_position == this._play_queue.get_n_items ()) {
// reached the end (?)
this.state = PlaybinState.STOPPED;
this.stopped ();
}
} }
break; break;
@ -185,8 +182,12 @@ public class Playbin : GLib.Object {
} }
public void seek (double position) { public void seek (double position) {
this.position = position; var rc = this.mpv.command ({"seek", position.to_string (), "absolute"});
assert (this.mpv.command ({"seek", position.to_string (), "absolute"}) >= 0); if (rc < 0) {
warning (@"could not seek to $position: $rc");
} else {
this.position = position;
}
} }
// manually changes which track in the play queue to play // manually changes which track in the play queue to play
@ -196,7 +197,6 @@ public class Playbin : GLib.Object {
assert (this.mpv.command ({"playlist-play-index", position.to_string ()}) >= 0); assert (this.mpv.command ({"playlist-play-index", position.to_string ()}) >= 0);
this.state = PlaybinState.PLAYING; this.state = PlaybinState.PLAYING;
this.play_queue_position = position; this.play_queue_position = position;
this.inc_position = false;
} }
public void pause () { public void pause () {
@ -224,7 +224,6 @@ public class Playbin : GLib.Object {
requires (this.state != PlaybinState.STOPPED) requires (this.state != PlaybinState.STOPPED)
{ {
if (this.play_queue_position+1 < this._play_queue.get_n_items ()) { if (this.play_queue_position+1 < this._play_queue.get_n_items ()) {
this.inc_position = false;
this.play_queue_position += 1; this.play_queue_position += 1;
assert (this.mpv.command ({"playlist-next-playlist"}) >= 0); assert (this.mpv.command ({"playlist-next-playlist"}) >= 0);
} else { } else {
@ -236,7 +235,6 @@ public class Playbin : GLib.Object {
requires (this.state != PlaybinState.STOPPED) requires (this.state != PlaybinState.STOPPED)
{ {
if (this.play_queue_position > 0) { if (this.play_queue_position > 0) {
this.inc_position = false;
this.play_queue_position -= 1; this.play_queue_position -= 1;
assert (this.mpv.command ({"playlist-prev-playlist"}) >= 0); assert (this.mpv.command ({"playlist-prev-playlist"}) >= 0);
} else { } else {