diff options
author | Ken VanDine <ken.vandine@canonical.com> | 2010-12-16 20:30:00 -0500 |
---|---|---|
committer | Ken VanDine <ken.vandine@canonical.com> | 2010-12-16 20:30:00 -0500 |
commit | 370d15ea33974c3a8339965263980b21403f21ca (patch) | |
tree | abab621ef062d725394be236c5cfa25a2124c60e /src/mpris2-controller.vala | |
parent | ce000aacc3fe96dae098fbea9bbc639e08ddf632 (diff) | |
parent | 2565fc2f86a1c81780ca8bcdb1f568b56031fa5a (diff) | |
download | ayatana-indicator-sound-370d15ea33974c3a8339965263980b21403f21ca.tar.gz ayatana-indicator-sound-370d15ea33974c3a8339965263980b21403f21ca.tar.bz2 ayatana-indicator-sound-370d15ea33974c3a8339965263980b21403f21ca.zip |
releasing version 0.5.3-0ubuntu1
Diffstat (limited to 'src/mpris2-controller.vala')
-rw-r--r-- | src/mpris2-controller.vala | 282 |
1 files changed, 127 insertions, 155 deletions
diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index f440c13..7f14efe 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -16,42 +16,12 @@ PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using DBus; using Dbusmenu; -[DBus (name = "org.mpris.MediaPlayer2")] -public interface MprisRoot : DBus.Object { - // properties - public abstract bool HasTracklist{owned get; set;} - public abstract bool CanQuit{owned get; set;} - public abstract bool CanRaise{owned get; set;} - public abstract string Identity{owned get; set;} - public abstract string DesktopEntry{owned get; set;} - // methods - public abstract async void Quit() throws DBus.Error; - public abstract async void Raise() throws DBus.Error; -} - -[DBus (name = "org.mpris.MediaPlayer2.Player")] -public interface MprisPlayer : DBus.Object { - - // properties - public abstract HashTable<string, Value?> Metadata{owned get; set;} - public abstract int32 Position{owned get; set;} - public abstract string PlaybackStatus{owned get; set;} - // methods - public abstract async void PlayPause() throws DBus.Error; - public abstract async void Next() throws DBus.Error; - public abstract async void Previous() throws DBus.Error; - // signals - public signal void Seeked(int64 new_position); -} [DBus (name = "org.freedesktop.DBus.Properties")] -public interface FreeDesktopProperties : DBus.Object{ - // signals - public signal void PropertiesChanged(string source, HashTable<string, - Value?> changed_properties, + public interface FreeDesktopProperties : Object{ + public signal void PropertiesChanged(string source, HashTable<string, Variant?> changed_properties, string[] invalid); } @@ -60,137 +30,139 @@ public interface FreeDesktopProperties : DBus.Object{ point in trying to get encorporate both into the same object model. */ public class Mpris2Controller : GLib.Object -{ - public static const string root_interface = "org.mpris.MediaPlayer2" ; - public MprisRoot mpris2_root {get; construct;} - public MprisPlayer player {get; construct;} - public PlayerController owner {get; construct;} - public FreeDesktopProperties properties_interface {get; construct;} - - public Mpris2Controller(PlayerController ctrl) - { - GLib.Object(owner: ctrl); - } - - construct{ +{ + public MprisRoot mpris2_root {get; construct;} + public MprisPlayer player {get; construct;} + public FreeDesktopProperties properties_interface {get; construct;} + + public PlayerController owner {get; construct;} + + public Mpris2Controller(PlayerController ctrl) + { + GLib.Object(owner: ctrl); + } + + construct{ try { - var connection = DBus.Bus.get (DBus.BusType.SESSION); - this.mpris2_root = (MprisRoot) connection.get_object (root_interface.concat(".").concat(this.owner.mpris_name), - "/org/mpris/MediaPlayer2", - root_interface); - this.player = (MprisPlayer) connection.get_object (root_interface.concat(".").concat(this.owner.mpris_name), - "/org/mpris/MediaPlayer2", - root_interface.concat(".Player")); - this.properties_interface = (FreeDesktopProperties) connection.get_object("org.freedesktop.Properties.PropertiesChanged", - "/org/mpris/MediaPlayer2"); - this.properties_interface.PropertiesChanged += property_changed_cb; + this.mpris2_root = Bus.get_proxy_sync ( BusType.SESSION, + this.owner.dbus_name, + "/org/mpris/MediaPlayer2" ); + this.player = Bus.get_proxy_sync ( BusType.SESSION, + this.owner.dbus_name, + "/org/mpris/MediaPlayer2" ); - } catch (DBus.Error e) { - error("Problems connecting to the session bus - %s", e.message); - } - } - - public void property_changed_cb(string interface_source, HashTable<string, Value?> changed_properties, string[] invalid ) - { - debug("properties-changed for interface %s and owner %s", interface_source, this.owner.mpris_name); - - if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false ){ - warning("Property-changed hash is null or this is an interface that doesn't concerns us"); - return; - } - Value? play_v = changed_properties.lookup("PlaybackStatus"); - if(play_v != null){ - string state = this.player.PlaybackStatus; - TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(state); - (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); - } - - Value? meta_v = changed_properties.lookup("Metadata"); - if(meta_v != null){ - GLib.HashTable<string, Value?> changed_updates = clean_metadata(); + this.properties_interface = Bus.get_proxy_sync ( BusType.SESSION, + "org.freedesktop.Properties.PropertiesChanged", + "/org/mpris/MediaPlayer2" ); + this.properties_interface.PropertiesChanged.connect ( property_changed_cb ); + } + catch (IOError e) { + error("Problems connecting to the session bus - %s", e.message); + } + } + + public void property_changed_cb ( string interface_source, + HashTable<string, Variant?> changed_properties, + string[] invalid ) + { + debug("properties-changed for interface %s and owner %s", interface_source, this.owner.dbus_name); + if ( changed_properties == null || + interface_source.has_prefix ( Mpris2Watcher.MPRIS_PREFIX ) == false ){ + warning("Property-changed hash is null or this is an interface that doesn't concerns us"); + return; + } + Variant? play_v = changed_properties.lookup("PlaybackStatus"); + if(play_v != null){ + // Race condition sometimes appears with the playback status + // 200ms timeout ensures we have the correct playback status at all times. + string state = this.player.PlaybackStatus; + //debug("in the property update and the playback status = %s and update = %s", state, (string)play_v); + Timeout.add ( 200, ensure_correct_playback_status ); + TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(state); + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); + } + Variant? meta_v = changed_properties.lookup("Metadata"); + if(meta_v != null){ + GLib.HashTable<string, Variant?> changed_updates = clean_metadata(); PlayerItem metadata = this.owner.custom_items[PlayerController.widget_order.METADATA]; - metadata.reset(MetadataMenuitem.attributes_format()); - metadata.update(changed_updates, - MetadataMenuitem.attributes_format()); - metadata.property_set_bool(MENUITEM_PROP_VISIBLE, - metadata.populated(MetadataMenuitem.attributes_format())); + metadata.reset ( MetadataMenuitem.attributes_format()); + metadata.update ( changed_updates, + MetadataMenuitem.attributes_format()); + metadata.property_set_bool ( MENUITEM_PROP_VISIBLE, + metadata.populated(MetadataMenuitem.attributes_format())); } - } - - private GLib.HashTable<string, Value?> clean_metadata() - { - GLib.HashTable<string, Value?> changed_updates = this.player.Metadata; - Value? artist_v = this.player.Metadata.lookup("xesam:artist"); + } + + private bool ensure_correct_playback_status(){ + debug("TEST playback status = %s", this.player.PlaybackStatus); + TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(this.player.PlaybackStatus); + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); + return false; + } + + private GLib.HashTable<string, Variant?>? clean_metadata() + { + GLib.HashTable<string, Variant?> changed_updates = this.player.Metadata; + Variant? artist_v = this.player.Metadata.lookup("xesam:artist"); if(artist_v != null){ - string[] artists = (string[])this.player.Metadata.lookup("xesam:artist"); - string display_artists = string.joinv(", ", artists); - changed_updates.replace("xesam:artist", display_artists); - debug("artist : %s", display_artists); + string[] artists = (string[])this.player.Metadata.lookup("xesam:artist"); + string display_artists = string.joinv(", ", artists); + changed_updates.replace("xesam:artist", display_artists); + debug("artist : %s", (string)changed_updates.lookup("xesam:artist")); } - Value? length_v = this.player.Metadata.lookup("mpris:length"); + Variant? length_v = this.player.Metadata.lookup("mpris:length"); if(length_v != null){ - int64 duration = this.player.Metadata.lookup("mpris:length").get_int64(); - changed_updates.replace("mpris:length", duration/1000000); + int64 duration = this.player.Metadata.lookup("mpris:length").get_int64(); + changed_updates.replace("mpris:length", duration/1000000); } - return changed_updates; - } - - private TransportMenuitem.state determine_play_state(string status){ - if(status != null && status == "Playing"){ - return TransportMenuitem.state.PLAYING; - } - return TransportMenuitem.state.PAUSED; - } - - public void initial_update() - { - TransportMenuitem.state update; - if(this.player.PlaybackStatus == null){ - update = TransportMenuitem.state.PAUSED; - } - else{ - update = determine_play_state(this.player.PlaybackStatus); - } - (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(update); - GLib.HashTable<string, Value?> cleaned_metadata = this.clean_metadata(); - this.owner.custom_items[PlayerController.widget_order.METADATA].update(cleaned_metadata, - MetadataMenuitem.attributes_format()); - } - - public void transport_update(TransportMenuitem.action command) - { - debug("transport_event input = %i", (int)command); - if(command == TransportMenuitem.action.PLAY_PAUSE){ - this.player.PlayPause.begin(); - } - else if(command == TransportMenuitem.action.PREVIOUS){ - this.player.Previous.begin(); - } - else if(command == TransportMenuitem.action.NEXT){ - this.player.Next.begin(); - } - } - - public bool connected() - { - return (this.player != null && this.mpris2_root != null); - } - - - public bool was_successfull(){ - if(this.mpris2_root == null || this.player == null){ - return false; - } - return true; - } + return changed_updates; + } - public void expose() - { - if(this.connected() == true){ - this.mpris2_root.Raise.begin(); - } - } -} - + private TransportMenuitem.state determine_play_state(string? status){ + if(status != null && status == "Playing"){ + return TransportMenuitem.state.PLAYING; + } + return TransportMenuitem.state.PAUSED; + } + + public void initial_update() + { + TransportMenuitem.state update; + if(this.player.PlaybackStatus == null){ + update = TransportMenuitem.state.PAUSED; + } + update = determine_play_state(null); + + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(TransportMenuitem.state.PAUSED); + GLib.HashTable<string, Value?>? cleaned_metadata = this.clean_metadata(); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(cleaned_metadata, + MetadataMenuitem.attributes_format()); + } + + public void transport_update(TransportMenuitem.action command) + { + debug("transport_event input = %i", (int)command); + if(command == TransportMenuitem.action.PLAY_PAUSE){ + this.player.PlayPause.begin(); + } + else if(command == TransportMenuitem.action.PREVIOUS){ + this.player.Previous.begin(); + } + else if(command == TransportMenuitem.action.NEXT){ + this.player.Next.begin(); + } + } + public bool connected() + { + return (this.player != null && this.mpris2_root != null); + } + + public void expose() + { + if(this.connected() == true){ + this.mpris2_root.Raise.begin(); + } + } +}
\ No newline at end of file |