use pipe for mpv wakeup callback
hopefully works better with the gtk main loop but idk lol
This commit is contained in:
parent
2b2ace0f5c
commit
72d4e63249
2 changed files with 127 additions and 100 deletions
|
@ -57,9 +57,6 @@ public class Playbin : GLib.Object {
|
||||||
public ListStore _play_queue;
|
public ListStore _play_queue;
|
||||||
public ListModel play_queue { get { return this._play_queue; } }
|
public ListModel play_queue { get { return this._play_queue; } }
|
||||||
|
|
||||||
// try to prevent wait_event to be called twice
|
|
||||||
private bool is_handling_event = false;
|
|
||||||
|
|
||||||
private async Mpv.Error mpv_command_async (string[] args) {
|
private async Mpv.Error mpv_command_async (string[] args) {
|
||||||
CommandCallback cc = {};
|
CommandCallback cc = {};
|
||||||
|
|
||||||
|
@ -70,6 +67,9 @@ public class Playbin : GLib.Object {
|
||||||
return cc.error;
|
return cc.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// should be Mpv.WakeupCallback, but i think there's a vala bug here
|
||||||
|
private SourceOnceFunc wakeup_callback; // anchor reference here, mpv won't remind us
|
||||||
|
|
||||||
public Playbin () {
|
public Playbin () {
|
||||||
this._play_queue = new ListStore (typeof (Subsonic.Song));
|
this._play_queue = new ListStore (typeof (Subsonic.Song));
|
||||||
|
|
||||||
|
@ -83,10 +83,39 @@ public class Playbin : GLib.Object {
|
||||||
assert (this.mpv.observe_property (2, "playlist-pos", Mpv.Format.INT64) >= 0);
|
assert (this.mpv.observe_property (2, "playlist-pos", Mpv.Format.INT64) >= 0);
|
||||||
assert (this.mpv.observe_property (3, "pause", Mpv.Format.FLAG) >= 0);
|
assert (this.mpv.observe_property (3, "pause", Mpv.Format.FLAG) >= 0);
|
||||||
|
|
||||||
this.mpv.wakeup_callback = () => {
|
int wakeup_fds[2];
|
||||||
Idle.add (() => {
|
try {
|
||||||
if (this.is_handling_event) return false;
|
assert (Unix.open_pipe (wakeup_fds, 0));
|
||||||
this.is_handling_event = true;
|
} catch (Error e) {
|
||||||
|
error (@"could not open pipe for mpv wakeup: $(e.message)");
|
||||||
|
}
|
||||||
|
|
||||||
|
IOChannel wakeup_read = new IOChannel.unix_new (wakeup_fds[0]);
|
||||||
|
IOChannel wakeup_write = new IOChannel.unix_new (wakeup_fds[1]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
wakeup_read.set_encoding (null);
|
||||||
|
wakeup_write.set_encoding (null);
|
||||||
|
wakeup_write.set_buffered (false);
|
||||||
|
} catch (Error e) {
|
||||||
|
error (@"could not set up pipes for mpv wakeup: $(e.message)");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.wakeup_callback = () => {
|
||||||
|
try {
|
||||||
|
wakeup_write.write_chars ({0}, null);
|
||||||
|
} catch (Error e) {
|
||||||
|
error (@"could not write to mpv wakeup pipe: $(e.message)");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.mpv.wakeup_callback = this.wakeup_callback;
|
||||||
|
|
||||||
|
assert (0 < wakeup_read.add_watch (IOCondition.IN, (source, condition) => {
|
||||||
|
try {
|
||||||
|
wakeup_read.read_chars ({0}, null);
|
||||||
|
} catch (Error e) {
|
||||||
|
error (@"could not read from mpv wakeup pipe: $(e.message)");
|
||||||
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
var event = this.mpv.wait_event (0.0);
|
var event = this.mpv.wait_event (0.0);
|
||||||
|
@ -196,10 +225,8 @@ public class Playbin : GLib.Object {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.is_handling_event = false;
|
return true;
|
||||||
return false;
|
}));
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void seek (double position) {
|
public void seek (double position) {
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace Mpv {
|
||||||
[CCode (cname = "mpv_wait_event")]
|
[CCode (cname = "mpv_wait_event")]
|
||||||
public unowned Event? wait_event (double timeout);
|
public unowned Event? wait_event (double timeout);
|
||||||
|
|
||||||
public WakeupCallback wakeup_callback {
|
public unowned WakeupCallback wakeup_callback {
|
||||||
[CCode (cname = "mpv_set_wakeup_callback")] set;
|
[CCode (cname = "mpv_set_wakeup_callback")] set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue