diff --git a/src/main.vala b/src/main.vala index 4e50461..bf14419 100644 --- a/src/main.vala +++ b/src/main.vala @@ -17,14 +17,67 @@ * * SPDX-License-Identifier: GPL-3.0-or-later */ +Alsa.ElemId speaker_id; +Alsa.ElemId earpiece_id; + +void get_mixes (string earpiece, string speaker) { + var list = new List (); + Alsa.Card card; + Alsa.ElemList elem_list; + Alsa.ElemId elem_id; + Alsa.Card.open (out card, "hw:0"); + Alsa.ElemList.alloc (out elem_list); + Alsa.ElemId.alloc (out elem_id); + card.elem_list (elem_list); // Getting list without items + elem_list.alloc_space (elem_list.get_count ()); // Allocating items + card.elem_list (elem_list); // Getting list with items + for (uint i = 0; i < elem_list.get_count (); i++) { + elem_list.get_id (i, elem_id); + + var elem_name = elem_id.get_name (); + if (elem_name == speaker) { + Alsa.ElemId.alloc (out speaker_id); + elem_list.get_id (i, speaker_id); + } else if (elem_name == earpiece) { + Alsa.ElemId.alloc (out earpiece_id); + elem_list.get_id (i, earpiece_id); + } + if (elem_name.contains ("Voice Mixer VoiceMMode1")) { + message ("Available %s", elem_id.get_name ()); + } + } + if (speaker_id != null) { + message ("Speaker Setted %s", speaker_id.get_name ()); + } + if (earpiece_id != null) { + message ("Earpiece Setted %s", earpiece_id.get_name ()); + } +} + int main (string[] args) { + Alsa.Card card; + message ("Card open: %d", Alsa.Card.open (out card, "hw:0", Alsa.CardOpenType.NONBLOCK)); + + get_mixes ("SLIMBUS_0_RX Voice Mixer VoiceMMode1", "QUAT_MI2S_RX Voice Mixer VoiceMMode1"); Q6MeowD q6meowd_proxy = Bus.get_proxy_sync (BusType.SYSTEM, "org.postmarketos.q6meowd", "/org/postmarketos/q6meowd", DBusProxyFlags.NONE); CallAudioD callaudiod_proxy = Bus.get_proxy_sync (BusType.SESSION, "org.mobian_project.CallAudio", "/org/mobian_project/CallAudio", DBusProxyFlags.NONE); ((DBusProxy) callaudiod_proxy).g_properties_changed.connect ((props, inv) => { foreach (var prop in props) { var name = prop.get_child_value (0).get_string (); if (name == "SpeakerState") { + var is_speaker = prop.get_child_value (1).get_variant ().get_uint32 () == 1; q6meowd_proxy.stop_stream (); + Alsa.ElemValue ctl; + Alsa.ElemValue.alloc (out ctl); + if (is_speaker) { + ctl.set_id (speaker_id); + message ("Enabling speaker %s", speaker_id.get_name ()); + } else { + ctl.set_id (earpiece_id); + message ("Enabling earpiece %s", earpiece_id.get_name ()); + } + ctl.set_boolean (1, true); + card.elem_write (ctl); q6meowd_proxy.start_stream (); } } diff --git a/src/meson.build b/src/meson.build index faa19c1..99bff64 100644 --- a/src/meson.build +++ b/src/meson.build @@ -8,6 +8,7 @@ q6meow_output_switcher_deps = [ dependency('glib-2.0'), dependency('gobject-2.0'), dependency('gio-2.0'), + dependency('alsa') ] executable('q6meow_output_switcher', q6meow_output_switcher_sources,