WIP: Show active device
All checks were successful
PostmarketOS Build / Build for aarch64 (push) Successful in 52s
PostmarketOS Build / Build for x86_64 (push) Successful in 10s

Signed-off-by: Vasiliy Doylov <nekocwd@mainlining.org>
This commit is contained in:
Vasiliy Doylov 2025-06-11 02:10:39 +03:00
parent 475e40e70d
commit c687581f14
Signed by: NekoCWD
GPG key ID: B7BE22D44474A582
5 changed files with 106 additions and 5 deletions

71
src/logic/pulse.vala Normal file
View file

@ -0,0 +1,71 @@
using PulseAudio;
class CallPipe.Logic.Pulse : Object {
private GLibMainLoop p_loop = new GLibMainLoop ();
private Context context;
public string active_name { get; private set; }
construct {
context = new Context (p_loop.get_api (), Config.GETTEXT_PACKAGE);
context.set_state_callback (on_context_state_changed);
context.set_subscribe_callback (on_subscribe_callback);
this.context.connect (null, PulseAudio.Context.Flags.NOFAIL, null);
}
public void init () {
}
private void on_subscribe_callback (Context c, Context.SubscriptionEventType t, uint32 idx) {
get_default_device ();
}
private void on_context_state_changed (PulseAudio.Context ctx) {
switch (ctx.get_state ()) {
case Context.State.UNCONNECTED:
message ("PulseAudio state: UNCONNECTED");
break;
case Context.State.CONNECTING:
message ("PulseAudio state: CONNECTING");
break;
case Context.State.AUTHORIZING:
message ("PulseAudio state: AUTHORIZING");
break;
case Context.State.SETTING_NAME:
message ("PulseAudio state: SETTING_NAME");
break;
case Context.State.FAILED:
message ("PulseAudio state: FAILED");
break;
case Context.State.TERMINATED:
message ("PulseAudio state: TERMINATED");
break;
case Context.State.READY:
message ("PulseAudio state: READY");
context.subscribe (
Context.SubscriptionMask.SINK
| Context.SubscriptionMask.SOURCE
| Context.SubscriptionMask.SINK_INPUT
| Context.SubscriptionMask.SOURCE_OUTPUT);
get_default_device ();
break;
}
}
public void get_default_device () {
context.get_server_info ((ctx, info) => {
ctx.get_sink_info_by_name (info.default_sink_name, (ctx, i, eol) => {
if (eol == -1 || i == null) {
return;
}
active_name = "%s:%s".printf (i.description, i.active_port->name);
});
});
}
private static Pulse _instance = null;
public static Pulse instance {
get {
if (_instance == null)
_instance = new Pulse ();
return _instance;
}
}
}

View file

@ -24,5 +24,6 @@ int main (string[] args) {
Intl.textdomain (Config.GETTEXT_PACKAGE);
var app = new Callpipe.Application ();
CallPipe.Logic.Pulse.instance.init ();
return app.run (args);
}

View file

@ -2,12 +2,16 @@ callpipe_sources = [
'main.vala',
'application.vala',
'window.vala',
'logic/pulse.vala',
]
callpipe_deps = [
config_dep,
dependency('gtk4'),
dependency('libadwaita-1', version: '>= 1.4'),
dependency('libpulse'),
dependency('libpulse-mainloop-glib'),
dependency('libpulse-simple'),
]
blueprints = custom_target(

View file

@ -18,12 +18,36 @@ template $CallpipeWindow: Adw.ApplicationWindow {
}
}
content: Label label {
label: _("Hello, World!");
content: ScrolledWindow {
Adw.Clamp {
margin-end: 12;
margin-start: 12;
valign: center;
halign: center;
Box {
orientation: vertical;
spacing: 12;
Label {
label: _("Output:");
styles [
"title-1",
]
}
Label label {
wrap: true;
wrap-mode: char;
label: _("FIXME?");
styles [
"title-2",
]
}
}
}
};
};
}

View file

@ -25,5 +25,6 @@ public class Callpipe.Window : Adw.ApplicationWindow {
public Window (Gtk.Application app) {
Object (application: app);
CallPipe.Logic.Pulse.instance.bind_property ("active-name", label, "label", BindingFlags.DEFAULT);
}
}