diff options
-rw-r--r-- | src/volume-warning.vala | 100 |
1 files changed, 44 insertions, 56 deletions
diff --git a/src/volume-warning.vala b/src/volume-warning.vala index 3bed0c7..401da00 100644 --- a/src/volume-warning.vala +++ b/src/volume-warning.vala @@ -30,9 +30,47 @@ public class VolumeWarning : Object // true if the warning dialog is currently active public bool active { get; public set; default = false; } - // true iff we're playing unapproved loud multimedia over headphones + // true if we're playing unapproved loud multimedia over headphones public bool high_volume { get; protected set; default = false; } + // true if the active sink input has its role property set to multimedia + protected bool multimedia_active { get; set; default = false; } + + // true if the user has approved high volumes recently + protected bool high_volume_approved { get; set; default = false; } + + public enum Key { + VOLUME_UP, + VOLUME_DOWN + } + + public void user_keypress(Key key) { + if (key == Key.VOLUME_DOWN) + on_user_response(IndicatorSound.WarnNotification.Response.CANCEL); + } + + public VolumeWarning (IndicatorSound.Options options) + { + _options = options; + + _volume.volume = 0.0; + _volume.reason = VolumeControl.VolumeReasons.PULSE_CHANGE; + + if (loop == null) + loop = new PulseAudio.GLibMainLoop (); + + init_all_properties(); + + this.reconnect_to_pulse (); + + _notification = new IndicatorSound.WarnNotification(); + _notification.user_responded.connect((n, response) => on_user_response(response)); + } + + /*** + **** + ***/ + /* this is static to ensure it being freed after @context (loop does not have ref counting) */ private static PulseAudio.GLibMainLoop loop; @@ -50,22 +88,7 @@ public class VolumeWarning : Object private bool _pulse_use_stream_restore = false; private int32 _active_sink_input = -1; private string[] _valid_roles = {"multimedia", "alert", "alarm", "phone"}; - private string stream { - get { - if (_active_sink_input == -1) - return "alert"; - var path = _sink_input_hash[_active_sink_input]; - if (path == _objp_role_multimedia) - return "multimedia"; - if (path == _objp_role_alert) - return "alert"; - if (path == _objp_role_alarm) - return "alarm"; - if (path == _objp_role_phone) - return "phone"; - return "alert"; - } - } + private string? _objp_role_multimedia = null; private string? _objp_role_alert = null; private string? _objp_role_alarm = null; @@ -76,24 +99,6 @@ public class VolumeWarning : Object private VolumeControl.ActiveOutput _active_output = VolumeControl.ActiveOutput.SPEAKERS; private IndicatorSound.Options _options; - public VolumeWarning (IndicatorSound.Options options) - { - _options = options; - - _volume.volume = 0.0; - _volume.reason = VolumeControl.VolumeReasons.PULSE_CHANGE; - - if (loop == null) - loop = new PulseAudio.GLibMainLoop (); - - init_all_properties(); - - this.reconnect_to_pulse (); - - _notification = new IndicatorSound.WarnNotification(); - _notification.user_responded.connect((n, response) => on_user_response(response)); - } - private void init_all_properties() { init_high_volume(); @@ -249,6 +254,9 @@ public class VolumeWarning : Object sink_input_objp = _sink_input_hash.get (index); _active_sink_input = index; + multimedia_active = (index != -1) + && (_sink_input_hash.get(index) == _objp_role_multimedia); + /* Listen for role volume changes from pulse itself (external clients) */ try { var builder = new VariantBuilder (new VariantType ("ao")); @@ -610,21 +618,11 @@ public class VolumeWarning : Object private bool calculate_high_volume_from_volume(double volume) { return _active_port_headphones && _options.is_loud(_volume) - && (stream == "multimedia"); - } - - public void set_warning_volume() { - var vol = new VolumeControl.Volume(); - vol.volume = volume_to_double(_options.loud_volume()); - vol.reason = _volume.reason; - debug("Setting warning level volume from %f down to %f", _volume.volume, vol.volume); - volume = vol; + && multimedia_active; } /** HIGH VOLUME APPROVED PROPERTY **/ - public bool high_volume_approved { get; private set; default = false; } - private void approve_high_volume() { _high_volume_approved_at = GLib.get_monotonic_time(); update_high_volume_approved(); @@ -725,16 +723,6 @@ public class VolumeWarning : Object this.active = false; } - public enum Key { - VOLUME_UP, - VOLUME_DOWN - } - - public void user_keypress(Key key) { - if (key == Key.VOLUME_DOWN) - on_user_response(IndicatorSound.WarnNotification.Response.CANCEL); - } - // VOLUME CLAMPING private uint _clamp_to_loud_timeout = 0; |