diff options
author | Xavi Garcia Mena <xavi.garcia.mena@canonical.com> | 2016-02-23 13:48:46 +0100 |
---|---|---|
committer | Xavi Garcia Mena <xavi.garcia.mena@canonical.com> | 2016-02-23 13:48:46 +0100 |
commit | e40da89a473b15b64d036cdce2e1ead59770778b (patch) | |
tree | 1de74f75836e8c7246544ad08be30fa6ba729065 /src/volume-control-pulse.vala | |
parent | 957c495207b8c53ffa9d3622c24fdff4f31cebfa (diff) | |
download | ayatana-indicator-sound-e40da89a473b15b64d036cdce2e1ead59770778b.tar.gz ayatana-indicator-sound-e40da89a473b15b64d036cdce2e1ead59770778b.tar.bz2 ayatana-indicator-sound-e40da89a473b15b64d036cdce2e1ead59770778b.zip |
Created new class AccountsServiceAccess to hold all accounts service operations
Diffstat (limited to 'src/volume-control-pulse.vala')
-rw-r--r-- | src/volume-control-pulse.vala | 192 |
1 files changed, 12 insertions, 180 deletions
diff --git a/src/volume-control-pulse.vala b/src/volume-control-pulse.vala index cdc6953..43092d1 100644 --- a/src/volume-control-pulse.vala +++ b/src/volume-control-pulse.vala @@ -22,13 +22,6 @@ using PulseAudio; using Notify; using Gee; -[DBus (name="com.canonical.UnityGreeter.List")] -interface GreeterListInterface : Object -{ - public abstract async string get_active_entry () throws IOError; - public signal void entry_selected (string entry_name); -} - public class VolumeControlPulse : VolumeControl { private unowned PulseAudio.GLibMainLoop loop = null; @@ -55,34 +48,17 @@ public class VolumeControlPulse : VolumeControl private string? _objp_role_phone = null; private uint _pa_volume_sig_count = 0; - private DBusProxy _user_proxy; - private GreeterListInterface _greeter_proxy; - private Cancellable _mute_cancellable; - private Cancellable _volume_cancellable; - private Cancellable _last_running_player_cancellable; private uint _local_volume_timer = 0; private uint _accountservice_volume_timer = 0; private bool _send_next_local_volume = false; private double _account_service_volume = 0.0; private VolumeControl.ActiveOutput _active_output = VolumeControl.ActiveOutput.SPEAKERS; - private string _last_running_player = ""; + private AccountsServiceAccess _accounts_service_access; /** true when a microphone is active **/ public override bool active_mic { get; private set; default = false; } - public override string last_running_player - { - get - { - return _last_running_player; - } - set - { - sync_last_running_player_to_accountsservice.begin (value); - } - } - - public VolumeControlPulse (IndicatorSound.Options options, PulseAudio.GLibMainLoop loop) + public VolumeControlPulse (IndicatorSound.Options options, PulseAudio.GLibMainLoop loop, AccountsServiceAccess? accounts_service_access) { base(options); @@ -91,12 +67,14 @@ public class VolumeControlPulse : VolumeControl this.loop = loop; - _mute_cancellable = new Cancellable (); - _volume_cancellable = new Cancellable (); - _last_running_player_cancellable = new Cancellable(); - - setup_accountsservice.begin (); - + _accounts_service_access = accounts_service_access; + this._accounts_service_access.notify["volume"].connect(() => { + if (this._accounts_service_access.volume >= 0) { + _account_service_volume = this._accounts_service_access.volume; + // we need to wait for this to settle. + start_account_service_volume_timer(); + } + }); this.reconnect_to_pulse (); } @@ -552,7 +530,7 @@ public class VolumeControlPulse : VolumeControl public override void set_mute (bool mute) { if (set_mute_internal (mute)) - sync_mute_to_accountsservice.begin (mute); + _accounts_service_access.mute = mute; } public void toggle_mute () @@ -788,152 +766,6 @@ public class VolumeControlPulse : VolumeControl } /* AccountsService operations */ - private void accountsservice_props_changed_cb (DBusProxy proxy, Variant changed_properties, string[]? invalidated_properties) - { - Variant volume_variant = changed_properties.lookup_value ("Volume", VariantType.DOUBLE); - if (volume_variant != null) { - var volume = volume_variant.get_double (); - if (volume >= 0) { - _account_service_volume = volume; - // we need to wait for this to settle. - start_account_service_volume_timer(); - } - } - - Variant mute_variant = changed_properties.lookup_value ("Muted", VariantType.BOOLEAN); - if (mute_variant != null) { - var mute = mute_variant.get_boolean (); - set_mute_internal (mute); - } - - Variant last_running_player_variant = changed_properties.lookup_value ("LastRunningPlayer", VariantType.STRING); - if (last_running_player_variant != null) { - var last_player = last_running_player_variant.get_string (); - _last_running_player = last_player; - this.notify_property("last-running-player"); - } - } - - private async void setup_user_proxy (string? username_in = null) - { - var username = username_in; - _user_proxy = null; - - // Look up currently selected greeter user, if asked - if (username == null) { - try { - username = yield _greeter_proxy.get_active_entry (); - if (username == "" || username == null) - return; - } catch (GLib.Error e) { - warning ("unable to find Accounts path for user %s: %s", username, e.message); - return; - } - } - - // Get master AccountsService object - DBusProxy accounts_proxy; - try { - accounts_proxy = yield DBusProxy.create_for_bus (BusType.SYSTEM, DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | DBusProxyFlags.DO_NOT_CONNECT_SIGNALS, null, "org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts"); - } catch (GLib.Error e) { - warning ("unable to get greeter proxy: %s", e.message); - return; - } - - // Find user's AccountsService object - try { - var user_path_variant = yield accounts_proxy.call ("FindUserByName", new Variant ("(s)", username), DBusCallFlags.NONE, -1); - string user_path; - user_path_variant.get ("(o)", out user_path); - _user_proxy = yield DBusProxy.create_for_bus (BusType.SYSTEM, DBusProxyFlags.GET_INVALIDATED_PROPERTIES, null, "org.freedesktop.Accounts", user_path, "com.ubuntu.AccountsService.Sound"); - } catch (GLib.Error e) { - warning ("unable to find Accounts path for user %s: %s", username, e.message); - return; - } - - // Get current values and listen for changes - _user_proxy.g_properties_changed.connect (accountsservice_props_changed_cb); - try { - var props_variant = yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "GetAll", new Variant ("(s)", _user_proxy.get_interface_name ()), null, DBusCallFlags.NONE, -1); - Variant props; - props_variant.get ("(@a{sv})", out props); - accountsservice_props_changed_cb(_user_proxy, props, null); - } catch (GLib.Error e) { - debug("Unable to get properties for user %s at first try: %s", username, e.message); - } - } - - private void greeter_user_changed (string username) - { - setup_user_proxy.begin (username); - } - - private async void setup_accountsservice () - { - if (Environment.get_variable ("XDG_SESSION_CLASS") == "greeter") { - try { - _greeter_proxy = yield Bus.get_proxy (BusType.SESSION, "com.canonical.UnityGreeter", "/list"); - } catch (GLib.Error e) { - warning ("unable to get greeter proxy: %s", e.message); - return; - } - _greeter_proxy.entry_selected.connect (greeter_user_changed); - yield setup_user_proxy (); - } else { - // We are in a user session. We just need our own proxy - unowned string username = Environment.get_variable ("USER"); - if (username != "" && username != null) { - yield setup_user_proxy (username); - } - } - } - - private async void sync_mute_to_accountsservice (bool mute) - { - if (_user_proxy == null) - return; - - _mute_cancellable.cancel (); - _mute_cancellable.reset (); - - try { - yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "Muted", new Variant ("b", mute)), null, DBusCallFlags.NONE, -1, _mute_cancellable); - } catch (GLib.Error e) { - warning ("unable to sync mute to AccountsService: %s", e.message); - } - } - - private async void sync_last_running_player_to_accountsservice (string last_running_player) - { - if (_user_proxy == null) - return; - - _last_running_player_cancellable.cancel (); - _last_running_player_cancellable.reset (); - - try { - yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "LastRunningPlayer", new Variant ("s", last_running_player)), null, DBusCallFlags.NONE, -1, _last_running_player_cancellable); - } catch (GLib.Error e) { - warning ("unable to sync last running player to AccountsService: %s", e.message); - } - _last_running_player = last_running_player; - } - - private async void sync_volume_to_accountsservice (VolumeControl.Volume volume) - { - if (_user_proxy == null) - return; - - _volume_cancellable.cancel (); - _volume_cancellable.reset (); - - warning("Interface name: %s", _user_proxy.get_interface_name ()); - try { - yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "Volume", new Variant ("d", volume.volume)), null, DBusCallFlags.NONE, -1, _volume_cancellable); - } catch (GLib.Error e) { - warning ("unable to sync volume to AccountsService: %s", e.message); - } - } private void start_local_volume_timer() { @@ -943,7 +775,7 @@ public class VolumeControlPulse : VolumeControl stop_account_service_volume_timer(); if (_local_volume_timer == 0) { - sync_volume_to_accountsservice.begin (_volume); + _accounts_service_access.volume = _volume.volume; _local_volume_timer = Timeout.add_seconds (1, local_volume_changed_timeout); } else { _send_next_local_volume = true; |