Compare commits

..

2 commits

Author SHA1 Message Date
64dcceea22 debug destructors 2024-10-26 00:00:20 +02:00
72d4e63249 use pipe for mpv wakeup callback
hopefully works better with the gtk main loop but idk lol
2024-10-25 23:26:45 +02:00
9 changed files with 175 additions and 105 deletions

View file

@ -41,4 +41,8 @@ public class Audrey.Application : Adw.Application {
private void on_preferences_action () {
message ("app.preferences action activated");
}
~Application () {
debug ("destroying application");
}
}

View file

@ -20,6 +20,10 @@ class Mpris : Object {
public string desktop_entry { owned get { return "eu.callcc.audrey"; } }
public string[] supported_uri_schemes { owned get { return {}; } }
public string[] supported_mime_types { owned get { return {}; } }
~Mpris () {
debug ("destroying mpris");
}
}
[DBus (name = "org.mpris.MediaPlayer2.Player")]
@ -62,4 +66,8 @@ class MprisPlayer : Object {
public bool can_seek { get; default = false; }
[CCode (notify = false)]
public bool can_control { get { return false; } }
~MprisPlayer () {
debug ("destroying mpris player");
}
}

View file

@ -52,14 +52,11 @@ public class Playbin : GLib.Object {
public double position { get; private set; default = 0.0; }
public double duration { get; private set; default = 0.0; }
public Subsonic.Client api { get; set; default = null; }
public weak Subsonic.Client api { get; set; default = null; }
public ListStore _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) {
CommandCallback cc = {};
@ -70,6 +67,9 @@ public class Playbin : GLib.Object {
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 () {
this._play_queue = new ListStore (typeof (Subsonic.Song));
@ -83,10 +83,42 @@ public class Playbin : GLib.Object {
assert (this.mpv.observe_property (2, "playlist-pos", Mpv.Format.INT64) >= 0);
assert (this.mpv.observe_property (3, "pause", Mpv.Format.FLAG) >= 0);
this.mpv.wakeup_callback = () => {
Idle.add (() => {
if (this.is_handling_event) return false;
this.is_handling_event = true;
int wakeup_fds[2];
try {
assert (Unix.open_pipe (wakeup_fds, 0));
} 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]);
wakeup_read.set_close_on_unref (true);
wakeup_write.set_close_on_unref (true);
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) {
var event = this.mpv.wait_event (0.0);
@ -196,10 +228,8 @@ public class Playbin : GLib.Object {
}
}
this.is_handling_event = false;
return false;
});
};
return true;
}));
}
public void seek (double position) {
@ -358,4 +388,8 @@ public class Playbin : GLib.Object {
else if (this.play_queue_position >= to && this.play_queue_position < from) this.play_queue_position += 1;
}
}
~Playbin () {
debug ("destroying playbin");
}
}

View file

@ -248,4 +248,8 @@ public class Subsonic.Client : Object {
assert (msg.get_status () == Soup.Status.OK);
return yield new Gdk.Pixbuf.from_stream_async (stream, cancellable);
}
~Client () {
debug ("destroying subsonic client");
}
}

View file

@ -23,7 +23,7 @@ class Ui.PlayQueueSong : Gtk.Box {
public string play_icon_name { get; set; default = ""; }
private Playbin playbin;
private weak Playbin playbin;
public PlayQueueSong (Playbin playbin) {
this.playbin = playbin;
@ -110,7 +110,7 @@ class Ui.PlayQueueSong : Gtk.Box {
[GtkTemplate (ui = "/eu/callcc/audrey/ui/play_queue.ui")]
public class Ui.PlayQueue : Gtk.Box {
private Playbin _playbin;
private weak Playbin _playbin;
public Playbin playbin {
get { return _playbin; }
set {
@ -165,4 +165,8 @@ public class Ui.PlayQueue : Gtk.Box {
[GtkCallback] private string visible_child_name (uint n_items) {
return n_items > 0 ? "not-empty" : "empty";
}
~PlayQueue () {
debug ("destroying play queue widget");
}
}

View file

@ -2,7 +2,7 @@
class Ui.Playbar : Gtk.Box {
public Subsonic.Song? song { get; set; }
public Gdk.Paintable? playing_cover_art { get; set; }
public Playbin playbin { get; set; }
public weak Playbin playbin { get; set; }
public bool show_cover_art { get; set; default = true; }
public int volume {
@ -82,4 +82,8 @@ class Ui.Playbar : Gtk.Box {
[GtkCallback] private string song_album (Subsonic.Song? song) {
return song == null ? "" : song.album;
}
~Playbar () {
debug ("destroying playbar widget");
}
}

View file

@ -128,4 +128,8 @@ public class Ui.Setup : Adw.PreferencesDialog {
this.authn_can_edit = true;
}, "server-url", this.server_url, "username", this.username);
}
~Setup () {
debug ("destroying setup dialog");
}
}

View file

@ -115,4 +115,8 @@ class Ui.Window : Adw.ApplicationWindow {
[GtkCallback] private bool show_playbar_cover_art (string? stack_child) {
return stack_child != "play-queue";
}
~Window () {
debug ("destroying main window");
}
}

View file

@ -31,7 +31,7 @@ namespace Mpv {
public delegate void WakeupCallback ();
[CCode (cname = "mpv_handle", free_function = "mpv_destroy")]
[CCode (cname = "mpv_handle", free_function = "mpv_terminate_destroy")]
[Compact]
public class Handle {
[CCode (cname = "mpv_create")]
@ -43,7 +43,7 @@ namespace Mpv {
[CCode (cname = "mpv_wait_event")]
public unowned Event? wait_event (double timeout);
public WakeupCallback wakeup_callback {
public unowned WakeupCallback wakeup_callback {
[CCode (cname = "mpv_set_wakeup_callback")] set;
}
@ -70,6 +70,10 @@ namespace Mpv {
[CCode (cname = "mpv_observe_property")]
public Error observe_property (uint64 reply_userdata, string name, Format format);
~Handle () {
GLib.debug ("destroying mpv handle");
}
}
[CCode (cname = "mpv_format", cprefix = "MPV_FORMAT_", has_type_id = false)]