From 3c4fa4e68bd3a7b58a69a378fb22c8ffbc3d2e12 Mon Sep 17 00:00:00 2001 From: charles kerr Date: Mon, 28 Dec 2015 14:43:26 -0600 Subject: in volume-warning, use multimedia through direct pulse instead of dbus --- src/volume-warning.vala | 186 ++++++++++++++---------------------------------- 1 file changed, 54 insertions(+), 132 deletions(-) (limited to 'src') diff --git a/src/volume-warning.vala b/src/volume-warning.vala index f7e3d15..ea24875 100644 --- a/src/volume-warning.vala +++ b/src/volume-warning.vala @@ -70,29 +70,8 @@ public class VolumeWarning : Object The next line says 'uint' to unconfuse valac's code generator */ protected uint multimedia_volume { get; set; default = PulseAudio.Volume.MUTED; } - protected virtual async void set_pulse_multimedia_volume(PulseAudio.Volume volume) - { -#if 0 - var objp = _multimedia_objp; - if (objp == null) - return; - - try { - var builder = new VariantBuilder (new VariantType ("a(uu)")); - builder.add ("(uu)", 0, volume); - var volvar = builder.end (); - - GLib.message ("Setting multimedia volume to %s on path %s", volvar.print(true), objp); - yield _pconn.call ("org.PulseAudio.Ext.StreamRestore1.RestoreEntry", - objp, "org.freedesktop.DBus.Properties", "Set", - new Variant ("(ssv)", "org.PulseAudio.Ext.StreamRestore1.RestoreEntry", "Volume", volvar), - null, DBusCallFlags.NONE, -1); - - debug ("Set multimedia volume to %d on path %s", (int)volume, objp); - } catch (GLib.Error e) { - warning ("unable to set multimedia volume for stream obj path %s (%s)", objp, e.message); - } -#endif + protected virtual void set_multimedia_volume(PulseAudio.Volume volume) { + pulse_set_sink_input_volume(volume); } /*** @@ -102,11 +81,6 @@ public class VolumeWarning : Object // FIXME: what to do with this now? private bool _ignore_warning_this_time = false; -#if 0 - /* Used by the pulseaudio stream restore extension */ - private DBusConnection _pconn; -#endif - private IndicatorSound.Options _options; private void init_all_properties() @@ -136,6 +110,9 @@ public class VolumeWarning : Object private PulseAudio.Context _pulse_context = null; private uint _pulse_reconnect_timer = 0; private uint32 _multimedia_sink_input_index = PulseAudio.INVALID_INDEX; + private PulseAudio.Operation _sink_input_info_list_operation = null; + private PulseAudio.Operation _set_sink_input_volume_operation = null; + private unowned PulseAudio.CVolume _multimedia_cvolume; private bool is_active_multimedia (SinkInputInfo i) { @@ -150,23 +127,18 @@ public class VolumeWarning : Object return true; } - private PulseAudio.Operation _sink_input_info_list_operation = null; - private void pulse_on_sink_input_info (Context c, SinkInputInfo? i, int eol) { - if (eol != 0) + if (eol != 0) { GLib.message("at end of list, _multimedia_sink_input_index is %d", (int)_multimedia_sink_input_index); + _sink_input_info_list_operation = null; + } if (i == null) return; bool active = is_active_multimedia(i); - if (active) - _multimedia_sink_input_index = i.index; - else if (i.index == _multimedia_sink_input_index) - _multimedia_sink_input_index = PulseAudio.INVALID_INDEX; - if (active) { GLib.message("index %d", (int)i.index); GLib.message("name %s", i.name); @@ -176,12 +148,15 @@ public class VolumeWarning : Object GLib.message("driver %s", i.driver); } - if (i.index == _multimedia_sink_input_index) { - var vol = i.volume.max(); - if (multimedia_volume != vol) { - GLib.message("setting multimedia_volume to %d from pulse_on_sink_input_info()", (int)vol); - multimedia_volume = vol; - } + if (active) { + GLib.message("setting multimedia index to %d, volume to %d", (int)i.index, (int)i.volume.max()); + _multimedia_sink_input_index = i.index; + _multimedia_cvolume = i.volume; + multimedia_volume = i.volume.max(); + } + else if (i.index == _multimedia_sink_input_index) { + _multimedia_sink_input_index = PulseAudio.INVALID_INDEX; + multimedia_volume = PulseAudio.Volume.INVALID; } } @@ -296,112 +271,57 @@ public class VolumeWarning : Object warning( "pa_context_connect() failed: %s\n", PulseAudio.strerror(_pulse_context.errno())); } + /// - private void pulse_start() - { - pulse_reconnect(); - } + private PulseAudio.Operation _set_sink_input_volume_operation = null; - private void pulse_stop() + private void pulse_set_sink_input_volume_cancel() { - pulse_reconnect_soon_cancel(); - pulse_disconnect(); - pulse_update_sink_inputs_cancel(); + if (_set_sink_input_volume_operation != null) { + _set_sink_input_volume_operation.cancel(); + _set_sink_input_volume_operation = null; + } } -#if 0 - /*** - **** Tracking multimedia volume via StreamRestore - ***/ - - - private async void connect_to_stream_restore() + private void on_set_sink_input_volume_success(Context c, int success) { - _pconn = VolumeControlPulse.create_pulse_dbus_connection(); - GLib.message("_pconn is %p", (void*)_pconn); - if (_pconn == null) - return; - - _pconn.add_filter (pulse_dbus_filter); - - update_multimedia_objp(); - - // listen for StreamRestore1's NewEntry and EntryRemoved signals - try { - var builder = new VariantBuilder (new VariantType ("ao")); - builder.add ("o", "/org/pulseaudio/stream_restore1"); - yield _pconn.call ("org.PulseAudio.Core1", "/org/pulseaudio/core1", - "org.PulseAudio.Core1", "ListenForSignal", - new Variant ("(sao)", "org.PulseAudio.Ext.StreamRestore1.NewEntry", builder), - null, DBusCallFlags.NONE, -1); - - builder = new VariantBuilder (new VariantType ("ao")); - builder.add ("o", "/org/pulseaudio/stream_restore1"); - yield _pconn.call ("org.PulseAudio.Core1", "/org/pulseaudio/core1", - "org.PulseAudio.Core1", "ListenForSignal", - new Variant ("(sao)", "org.PulseAudio.Ext.StreamRestore1.EntryRemoved", builder), - null, DBusCallFlags.NONE, -1); - } catch (GLib.Error e) { - warning ("unable to listen for StreamRestore1 dbus signals (%s)", e.message); + if (success != 0) { + GLib.message("setting multimedia volume from on_set_sink_input_volume_success"); } } - private void update_multimedia_objp() + void pulse_set_sink_input_volume(PulseAudio.Volume volume) { - var objp = VolumeControlPulse.stream_restore_get_object_path( - _pconn, - "sink-input-by-media-role:multimedia"); - set_multimedia_object_path.begin(objp); - } + GLib.return_if_fail(_pulse_context != null); + GLib.return_if_fail(_multimedia_sink_input_index != PulseAudio.INVALID_INDEX); - private string _multimedia_objp = null; + unowned CVolume cvol = CVolume(); + cvol.pa_cvolume_set(_multimedia_cvolume.channels, volume); + GLib.message("setting multimedia volume to %s", cvol.to_string()); - private async void set_multimedia_object_path(string objp) - { - if (_multimedia_objp == objp) - return; + pulse_set_sink_input_volume_cancel(); - _multimedia_objp = objp; - - // listen for RestoreEntry.VolumeUpdated from this entry - try { - var builder = new VariantBuilder (new VariantType ("ao")); - builder.add ("o", _multimedia_objp); - yield _pconn.call ("org.PulseAudio.Core1", "/org/pulseaudio/core1", - "org.PulseAudio.Core1", "ListenForSignal", - new Variant ("(sao)", "org.PulseAudio.Ext.StreamRestore1.RestoreEntry.VolumeUpdated", builder), - null, DBusCallFlags.NONE, -1); - } catch (GLib.Error e) { - warning ("unable to listen for RestoreEntry dbus signals (%s)", e.message); - } + _set_sink_input_volume_operation = set_sink_input_volume( + _multimedia_sink_input_index, + cvol, + on_set_sink_input_volume_success); + } + + /// - update_multimedia_volume.begin(); + private void pulse_start() + { + pulse_reconnect(); } - private async void update_multimedia_volume() + private void pulse_stop() { - try { - var props_variant = yield _pconn.call ( - "org.PulseAudio.Ext.StreamRestore1.RestoreEntry", - _multimedia_objp, - "org.freedesktop.DBus.Properties", - "Get", - new Variant ("(ss)", "org.PulseAudio.Ext.StreamRestore1.RestoreEntry", "Volume"), - null, - DBusCallFlags.NONE, - -1); - Variant tmp; - props_variant.get ("(v)", out tmp); - uint32 type = 0, volume = 0; - VariantIter iter = tmp.iterator (); - iter.next ("(uu)", &type, &volume); - if (multimedia_volume != volume) - multimedia_volume = volume; - } catch (GLib.Error e) { - warning ("unable to get volume for multimedia role %s (%s)", _multimedia_objp, e.message); - } + pulse_reconnect_soon_cancel(); + pulse_update_sink_inputs_cancel(); + pulse_set_sink_input_volume_cancel(); + pulse_disconnect(); } -#endif + /** HIGH VOLUME PROPERTY **/ @@ -544,7 +464,9 @@ public class VolumeWarning : Object // lower the volume to just under the warning level GLib.message("setting multimedia volume to be just under the warning level"); - set_pulse_multimedia_volume.begin (_options.loud_volume()-1); + pulse_set_sink_input_volume(pulse_set_sink_input_volume(zzz + + set_multimedia_volume (_options.loud_volume()-1); GLib.message("leaving show()"); } @@ -552,7 +474,7 @@ public class VolumeWarning : Object if (response == IndicatorSound.WarnNotification.Response.OK) { approve_high_volume(); - set_pulse_multimedia_volume.begin(_ok_volume); + set_multimedia_volume(_ok_volume); } _ok_volume = PulseAudio.Volume.INVALID; -- cgit v1.2.3