diff options
Diffstat (limited to 'src/volume-warning-pulse.vala')
-rw-r--r-- | src/volume-warning-pulse.vala | 116 |
1 files changed, 46 insertions, 70 deletions
diff --git a/src/volume-warning-pulse.vala b/src/volume-warning-pulse.vala index 9be2359..335c8bf 100644 --- a/src/volume-warning-pulse.vala +++ b/src/volume-warning-pulse.vala @@ -26,16 +26,17 @@ public class VolumeWarningPulse : VolumeWarning public VolumeWarningPulse (IndicatorSound.Options options, PulseAudio.GLibMainLoop pgloop) { base(options); + _pgloop = pgloop; - pulse_start(); + pulse_reconnect(); } - ~VolumeWarningPulse () - { - pulse_stop(); + ~VolumeWarningPulse () { + pulse_reconnect_soon_cancel(); + pulse_disconnect(); } - protected override void sound_system_set_multimedia_volume(PulseAudio.Volume volume) { + protected override void sound_system_set_multimedia_volume (PulseAudio.Volume volume) { pulse_set_sink_volume(volume); } @@ -53,8 +54,8 @@ public class VolumeWarningPulse : VolumeWarning private unowned PulseAudio.CVolume _multimedia_cvolume; - private bool is_active_multimedia (SinkInputInfo i) - { + private bool is_active_multimedia (SinkInputInfo i) { + if (i.corked != 0) return false; @@ -66,61 +67,55 @@ public class VolumeWarningPulse : VolumeWarning return true; } - private void update_multimedia_volume() - { + private void update_multimedia_volume () { + GLib.return_if_fail(_pulse_context != null); GLib.return_if_fail(_multimedia_sink_index != PulseAudio.INVALID_INDEX); - GLib.message("updating multimedia volume"); - _pulse_context.get_sink_info_by_index(_multimedia_sink_index, (c,i) => { GLib.return_if_fail(i != null); + GLib.message("setting multimedia_volume to %s", i.volume.to_string()); _multimedia_cvolume = i.volume; multimedia_volume = i.volume.max(); }); } - private void set_multimedia_sink_index(uint32 index) - { - if (index == PulseAudio.INVALID_INDEX) - { + private void set_multimedia_sink_index(uint32 index) { + + if (index == PulseAudio.INVALID_INDEX) { _multimedia_sink_index = PulseAudio.INVALID_INDEX; multimedia_volume = PulseAudio.Volume.INVALID; - } - else if (_multimedia_sink_index != index) - { + } else if (_multimedia_sink_index != index) { _multimedia_sink_index = index; multimedia_volume = PulseAudio.Volume.INVALID; update_multimedia_volume(); } } - private void on_sink_input_info (Context c, SinkInputInfo? i, int eol) - { + private void on_sink_input_info (Context c, SinkInputInfo? i, int eol) { + if (i == null) return; - if (is_active_multimedia(i)) { - GLib.message("on_sink_input_info() setting multimedia sink input index to %d, sink index to %d", (int)i.index, (int)i.sink); + if (is_active_multimedia (i)) { + GLib.message ("on_sink_input_info() setting multimedia sink input index to %d, sink index to %d", (int)i.index, (int)i.sink); _multimedia_sink_input_index = i.index; - set_multimedia_sink_index(i.sink); + set_multimedia_sink_index (i.sink); multimedia_active = true; } else if (i.index == _multimedia_sink_input_index) { _multimedia_sink_input_index = PulseAudio.INVALID_INDEX; - set_multimedia_sink_index(PulseAudio.INVALID_INDEX); + set_multimedia_sink_index (PulseAudio.INVALID_INDEX); multimedia_active = false; } } - private void pulse_update_sink_inputs() - { + private void pulse_update_sink_inputs () { _pulse_context.get_sink_input_info_list (on_sink_input_info); } - private void context_events_cb (Context c, Context.SubscriptionEventType t, uint32 index) - { + private void context_events_cb (Context c, Context.SubscriptionEventType t, uint32 index) { switch (t & Context.SubscriptionEventType.FACILITY_MASK) { case Context.SubscriptionEventType.SINK: @@ -133,15 +128,15 @@ public class VolumeWarningPulse : VolumeWarning { case Context.SubscriptionEventType.NEW: case Context.SubscriptionEventType.CHANGE: - GLib.message("-> Context.SubscriptionEventType.CHANGE or NEW"); - c.get_sink_input_info(index, on_sink_input_info); + GLib.message ("-> Context.SubscriptionEventType.CHANGE or NEW"); + c.get_sink_input_info (index, on_sink_input_info); break; case Context.SubscriptionEventType.REMOVE: - GLib.message("-> Context.SubscriptionEventType.REMOVE"); - pulse_update_sink_inputs(); + GLib.message ("-> Context.SubscriptionEventType.REMOVE"); + pulse_update_sink_inputs (); break; default: - GLib.debug("Sink input event not known."); + GLib.debug ("Sink input event not known."); break; } break; @@ -151,19 +146,18 @@ public class VolumeWarningPulse : VolumeWarning } } - private void pulse_context_state_callback (Context c) - { + private void pulse_context_state_callback (Context c) { switch (c.get_state ()) { case Context.State.READY: c.set_subscribe_callback (context_events_cb); c.subscribe (PulseAudio.Context.SubscriptionMask.SINK | PulseAudio.Context.SubscriptionMask.SINK_INPUT); - pulse_update_sink_inputs(); + pulse_update_sink_inputs (); break; case Context.State.FAILED: case Context.State.TERMINATED: - pulse_reconnect_soon(); + pulse_reconnect_soon (); break; default: @@ -171,37 +165,32 @@ public class VolumeWarningPulse : VolumeWarning } } - private void pulse_disconnect() - { + private void pulse_disconnect () { if (_pulse_context != null) { _pulse_context.disconnect (); _pulse_context = null; } } - private void pulse_reconnect_soon () - { + private void pulse_reconnect_soon () { if (_pulse_reconnect_timer == 0) _pulse_reconnect_timer = Timeout.add_seconds (2, pulse_reconnect_timeout); } - private void pulse_reconnect_soon_cancel() - { + private void pulse_reconnect_soon_cancel () { if (_pulse_reconnect_timer != 0) { - Source.remove(_pulse_reconnect_timer); + Source.remove (_pulse_reconnect_timer); _pulse_reconnect_timer = 0; } } - private bool pulse_reconnect_timeout () - { + private bool pulse_reconnect_timeout () { _pulse_reconnect_timer = 0; pulse_reconnect (); return Source.REMOVE; } - void pulse_reconnect () - { + void pulse_reconnect () { pulse_disconnect(); var props = new Proplist (); @@ -213,38 +202,25 @@ public class VolumeWarningPulse : VolumeWarning _pulse_context = new PulseAudio.Context (_pgloop.get_api(), null, props); _pulse_context.set_state_callback (pulse_context_state_callback); - var server_string = Environment.get_variable("PULSE_SERVER"); - if (_pulse_context.connect(server_string, Context.Flags.NOFAIL, null) < 0) - warning( "pa_context_connect() failed: %s\n", PulseAudio.strerror(_pulse_context.errno())); + var server_string = Environment.get_variable ("PULSE_SERVER"); + if (_pulse_context.connect (server_string, Context.Flags.NOFAIL, null) < 0) + GLib.warning ("pa_context_connect() failed: %s\n", PulseAudio.strerror(_pulse_context.errno())); } - void pulse_set_sink_volume(PulseAudio.Volume volume) - { + void pulse_set_sink_volume (PulseAudio.Volume volume) { var index = _warning_sink_index; GLib.return_if_fail(_pulse_context != null); GLib.return_if_fail(index != PulseAudio.INVALID_INDEX); GLib.return_if_fail(volume != PulseAudio.Volume.INVALID); - unowned CVolume cvol = CVolume(); - cvol.set(_multimedia_cvolume.channels, volume); - GLib.message("setting multimedia volume to %s", cvol.to_string()); - _pulse_context.set_sink_volume_by_index(index, cvol); - } - - private void pulse_start() - { - pulse_reconnect(); - } - - private void pulse_stop() - { - pulse_reconnect_soon_cancel(); - pulse_disconnect(); + unowned CVolume cvol = CVolume (); + cvol.set (_multimedia_cvolume.channels, volume); + GLib.message ("setting multimedia volume to %s", cvol.to_string()); + _pulse_context.set_sink_volume_by_index (index, cvol); } - protected override void preshow() - { + protected override void preshow () { _warning_sink_index = _multimedia_sink_index; } } |