From 72ffb2c3c096cf0e7ece12c93bfeff5b651fed13 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 12 Aug 2010 13:21:57 +0100 Subject: abstracted the mpris handling to accomodate the messy integration issues --- src/mpris2-controller.vala | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index 20cfc9e..6c1b71a 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -58,30 +58,46 @@ public class Mpris2Controller : GLib.Object public Mpris2Controller(PlayerController ctrl) { - Object(owner: ctrl); + Object(owner: ctrl); + this.mpris2_root = null; + this.mpris2_player = null; } construct{ try { - debug("going to create this mpris 2 controller"); + debug("Going to try and create an mpris 2 controller"); this.connection = DBus.Bus.get (DBus.BusType.SESSION); } catch (Error e) { error("Problems connecting to the session bus - %s", e.message); - } - this.mpris2_root = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()), - "/org/mpris/MediaPlayer", - "org.mpris.MediaPlayer"); - - this.mpris2_player = (MprisPlayer)this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()) , - "/org/mpris/MediaPlayer/Player", - "org.mpris.MediaPlayer.Player"); - this.mpris2_player.TrackChanged += onTrackChanged; - this.mpris2_player.StatusChanged += onStatusChanged; - initial_update(); + } + + try { + this.mpris2_root = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()), + "/org/mpris/MediaPlayer", + "org.mpris.MediaPlayer"); + this.mpris2_player = (MprisPlayer)this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()) , + "/org/mpris/MediaPlayer/Player", + "org.mpris.MediaPlayer.Player"); + } + catch(Error e){ + error("Problems connecting to + } + } + + public bool was_successfull(){ + if(this.mpris2_root == null || + this.mpris2_player == null) + { + return false; + } + return true; } - private void initial_update() + public void initial_update() { + this.mpris2_player.TrackChanged += onTrackChanged; + this.mpris2_player.StatusChanged += onStatusChanged; + bool r = (bool)this.mpris2_player.Status.Shuffle_State; int32 p = (int32)this.mpris2_player.Status.Playback_State; -- cgit v1.2.3 From 30a697a1027229c23857ced856c0fdbd15b40d14 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 12 Aug 2010 20:36:14 +0100 Subject: moving mpris2 to gdbus, the horror --- src/mpris2-controller.vala | 105 ++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 54 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index 6c1b71a..e8783e7 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -17,32 +17,39 @@ 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 . */ -using Gee; -[DBus (name = "org.mpris.MediaPlayer.Player")] +using GLib; +using Bus; + +[DBus (name = Mpris2Controller.root_interface)] +public interface MprisRoot : 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 void Quit() throws IOError; + public abstract void Raise() throws IOError; +} + +[DBus (name = Mpris2Controller.root_interface.concat(".Player"))] public interface MprisPlayer : Object { - public struct Status { - public int32 Playback_State; - public double Playback_Rate; - public bool Repeat_State; - public bool Shuffle_State; - public bool Endless_State; - } - - public abstract HashTable Metadata{owned get;} - public abstract double Volume{get;} - public abstract int32 Capabilities{get;} - public abstract int32 Position{get;} + public abstract HashTable Metadata{owned get; set;} + public abstract double Volume{owned get; set;} + public abstract int32 Capabilities{owned get; set;} + public abstract int32 Position{owned get; set;} - public abstract void SetPosition(string prop, int32 pos) throws DBus.Error; - public abstract void PlayPause() throws DBus.Error; - public abstract void Pause() throws DBus.Error; - public abstract void Next() throws DBus.Error; - public abstract void Previous() throws DBus.Error; - - public abstract signal void StatusChanged(Status update); - public abstract signal void TrackChanged(HashTable Metadata); + public abstract void SetPosition(string prop, int32 pos) throws IOError; + public abstract void PlayPause() throws IOError; + public abstract void Pause() throws IOError; + public abstract void Next() throws IOError; + public abstract void Previous() throws IOError; + + //public abstract signal void StatusChanged(Status update); + //public abstract signal void TrackChanged(HashTable Metadata); } /* @@ -51,43 +58,29 @@ public interface MprisPlayer : Object { */ public class Mpris2Controller : GLib.Object { - private DBus.Connection connection; - public dynamic DBus.Object mpris2_root {get; construct;} + public static const string root_interface = "org.mpris.MediaPlayer2" ; + public MprisRoot mpris2_root {get; construct;} public MprisPlayer mpris2_player {get; construct;} public PlayerController owner {get; construct;} public Mpris2Controller(PlayerController ctrl) { Object(owner: ctrl); - this.mpris2_root = null; - this.mpris2_player = null; } construct{ - try { - debug("Going to try and create an mpris 2 controller"); - this.connection = DBus.Bus.get (DBus.BusType.SESSION); - } catch (Error e) { - error("Problems connecting to the session bus - %s", e.message); - } - - try { - this.mpris2_root = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()), - "/org/mpris/MediaPlayer", - "org.mpris.MediaPlayer"); - this.mpris2_player = (MprisPlayer)this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()) , - "/org/mpris/MediaPlayer/Player", - "org.mpris.MediaPlayer.Player"); - } - catch(Error e){ - error("Problems connecting to - } - } + this.mpris2_root = Bus.get_proxy_sync (BusType.SESSION, + root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2"); + + this.mpris2_player = Bus.get_proxy_sync (BusType.SESSION, + root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2/Player"); + } + public bool was_successfull(){ - if(this.mpris2_root == null || - this.mpris2_player == null) - { + if(this.mpris2_root == null ||this.mpris2_player == null){ return false; } return true; @@ -95,7 +88,7 @@ public class Mpris2Controller : GLib.Object public void initial_update() { - this.mpris2_player.TrackChanged += onTrackChanged; + /*this.mpris2_player.TrackChanged += onTrackChanged; this.mpris2_player.StatusChanged += onStatusChanged; bool r = (bool)this.mpris2_player.Status.Shuffle_State; @@ -111,11 +104,12 @@ public class Mpris2Controller : GLib.Object ScrubMenuitem.attributes_format()); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris2_player.Position); - + */ } public void transport_event(TransportMenuitem.action command) { + /* debug("transport_event input = %i", (int)command); if(command == TransportMenuitem.action.PLAY_PAUSE){ debug("transport_event PLAY_PAUSE"); @@ -126,11 +120,13 @@ public class Mpris2Controller : GLib.Object } else if(command == TransportMenuitem.action.NEXT){ this.mpris2_player.Next(); - } + } + */ } public void set_position(double position) - { + { + /* debug("Set position with pos (0-100) %f", position); HashTable data = this.mpris2_player.Metadata; Value? time_value = data.lookup("time"); @@ -156,6 +152,7 @@ public class Mpris2Controller : GLib.Object //this.mpris2_player.SetPosition((int32)(new_time_position)); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris2_player.Position); + */ } public bool connected() @@ -163,7 +160,7 @@ public class Mpris2Controller : GLib.Object return (this.mpris2_player != null); } - private void onStatusChanged(MprisPlayer.Status st) + /*private void onStatusChanged(MprisPlayer.Status st) { debug("onStatusChange - play state %i", st.Playback_State); HashTable ht = new HashTable(str_hash, str_equal); @@ -191,7 +188,7 @@ public class Mpris2Controller : GLib.Object ScrubMenuitem.attributes_format()); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris2_player.Position); - } + }*/ } -- cgit v1.2.3 From a936550cb2d904f09f712712a38c76779905d3b5 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 13 Aug 2010 14:48:29 +0100 Subject: back on dbus-glib-1 and motoring through basic mpris2 --- src/mpris2-controller.vala | 88 ++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 54 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index e8783e7..debbd76 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -18,10 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using GLib; -using Bus; - -[DBus (name = Mpris2Controller.root_interface)] +[DBus (name = "org.mpris.MediaPlayer2")] public interface MprisRoot : Object { // properties public abstract bool HasTracklist{owned get; set;} @@ -30,26 +27,25 @@ public interface MprisRoot : Object { public abstract string Identity{owned get; set;} public abstract string DesktopEntry{owned get; set;} // methods - public abstract void Quit() throws IOError; - public abstract void Raise() throws IOError; + public abstract void Quit() throws DBus.Error; + public abstract void Raise() throws DBus.Error; } -[DBus (name = Mpris2Controller.root_interface.concat(".Player"))] +[DBus (name = "org.mpris.MediaPlayer2.Player")] public interface MprisPlayer : Object { public abstract HashTable Metadata{owned get; set;} - public abstract double Volume{owned get; set;} public abstract int32 Capabilities{owned get; set;} public abstract int32 Position{owned get; set;} + public abstract string PlaybackStatus{owned get; set;} - public abstract void SetPosition(string prop, int32 pos) throws IOError; - public abstract void PlayPause() throws IOError; - public abstract void Pause() throws IOError; - public abstract void Next() throws IOError; - public abstract void Previous() throws IOError; - - //public abstract signal void StatusChanged(Status update); - //public abstract signal void TrackChanged(HashTable Metadata); + public abstract void SetPosition(string prop, int32 pos) throws DBus.Error; + public abstract void PlayPause() throws DBus.Error; + public abstract void Pause() throws DBus.Error; + public abstract void Next() throws DBus.Error; + public abstract void Previous() throws DBus.Error; + + public signal void Seeked(int new_position); } /* @@ -63,20 +59,35 @@ public class Mpris2Controller : GLib.Object public MprisPlayer mpris2_player {get; construct;} public PlayerController owner {get; construct;} + public Mpris2Controller(PlayerController ctrl) { Object(owner: ctrl); } construct{ - this.mpris2_root = Bus.get_proxy_sync (BusType.SESSION, - root_interface.concat(".").concat(this.owner.name.down()), - "/org/mpris/MediaPlayer2"); - - this.mpris2_player = Bus.get_proxy_sync (BusType.SESSION, - root_interface.concat(".").concat(this.owner.name.down()), - "/org/mpris/MediaPlayer2/Player"); + try { + var connection = DBus.Bus.get (DBus.BusType.SESSION); + this.mpris2_root = (MprisRoot) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2", + root_interface); + this.mpris2_player = (MprisPlayer) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2/Player", + root_interface.concat(".Player")); + this.mpris2_player.Seeked += onSeeked; + this.mpris2_player.notify["PlaybackStatus"].connect (property_changed); + + } catch (DBus.Error e) { + error("Problems connecting to the session bus - %s", e.message); + } + } + public void onSeeked(int position){ + debug("Seeked signal callback"); + } + + public void property_changed(Object mpris_player, ParamSpec new_status){ + debug("playback status changed, %s", new_status.get_name()); } public bool was_successfull(){ @@ -109,7 +120,6 @@ public class Mpris2Controller : GLib.Object public void transport_event(TransportMenuitem.action command) { - /* debug("transport_event input = %i", (int)command); if(command == TransportMenuitem.action.PLAY_PAUSE){ debug("transport_event PLAY_PAUSE"); @@ -121,7 +131,6 @@ public class Mpris2Controller : GLib.Object else if(command == TransportMenuitem.action.NEXT){ this.mpris2_player.Next(); } - */ } public void set_position(double position) @@ -160,35 +169,6 @@ public class Mpris2Controller : GLib.Object return (this.mpris2_player != null); } - /*private void onStatusChanged(MprisPlayer.Status st) - { - debug("onStatusChange - play state %i", st.Playback_State); - HashTable ht = new HashTable(str_hash, str_equal); - Value v = Value(typeof(int)); - v.set_int(st.Playback_State); - ht.insert("state", v); - this.owner.custom_items[PlayerController.widget_order.TRANSPORT].update(ht, TransportMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.SCRUB].update(ht, ScrubMenuitem.attributes_format()); - } - - private void onTrackChanged(HashTable ht) - { - this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht, - MetadataMenuitem.attributes_format()); - debug("about to update the duration on the scrub bar"); - Value? v = ht.lookup("time"); - if(v != null) - { - debug("with the duration of %i", (int)v.get_uint()); - debug("with Position of %i", this.mpris2_player.Position); - } - this.owner.custom_items[PlayerController.widget_order.SCRUB].update(ht, - ScrubMenuitem.attributes_format()); - ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.mpris2_player.Position); - }*/ } -- cgit v1.2.3 From f648465adb85a872c97bdb9b9a7d638cb8803049 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 13 Aug 2010 18:57:00 +0100 Subject: player object implemented bar the property signal thing --- src/mpris2-controller.vala | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index debbd76..fb17bea 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -35,7 +35,6 @@ public interface MprisRoot : Object { public interface MprisPlayer : Object { public abstract HashTable Metadata{owned get; set;} - public abstract int32 Capabilities{owned get; set;} public abstract int32 Position{owned get; set;} public abstract string PlaybackStatus{owned get; set;} @@ -96,17 +95,19 @@ public class Mpris2Controller : GLib.Object } return true; } + + private int determine_play_state(){ + string status = this.mpris2_player.PlaybackStatus; + if(status == "Playing"){ + return 0; + } + return 1; + } public void initial_update() { - /*this.mpris2_player.TrackChanged += onTrackChanged; - this.mpris2_player.StatusChanged += onStatusChanged; - - bool r = (bool)this.mpris2_player.Status.Shuffle_State; - int32 p = (int32)this.mpris2_player.Status.Playback_State; - + int32 p = determine_play_state(); debug("initial update - play state %i", p); - debug("initial update - shuffle state %s", r.to_string()); (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris2_player.Metadata, @@ -115,7 +116,7 @@ public class Mpris2Controller : GLib.Object ScrubMenuitem.attributes_format()); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris2_player.Position); - */ + } public void transport_event(TransportMenuitem.action command) @@ -123,13 +124,31 @@ public class Mpris2Controller : GLib.Object debug("transport_event input = %i", (int)command); if(command == TransportMenuitem.action.PLAY_PAUSE){ debug("transport_event PLAY_PAUSE"); - this.mpris2_player.PlayPause(); + try{ + this.mpris2_player.PlayPause(); + } + catch(DBus.Error error){ + warning("DBus Error calling the player objects PlayPause method %s", + error.message); + } } else if(command == TransportMenuitem.action.PREVIOUS){ - this.mpris2_player.Previous(); + try{ + this.mpris2_player.Previous(); + } + catch(DBus.Error error){ + warning("DBus Error calling the player objects Previous method %s", + error.message); + } } else if(command == TransportMenuitem.action.NEXT){ - this.mpris2_player.Next(); + try{ + this.mpris2_player.Next(); + } + catch(DBus.Error error){ + warning("DBus Error calling the player objects Next method %s", + error.message); + } } } -- cgit v1.2.3 From 04af32d9b321d4256cb1f7cf1f94b23387b75774 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 13 Aug 2010 19:12:45 +0100 Subject: a few tidy ups --- src/mpris2-controller.vala | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index fb17bea..cfe0d68 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -58,7 +58,6 @@ public class Mpris2Controller : GLib.Object public MprisPlayer mpris2_player {get; construct;} public PlayerController owner {get; construct;} - public Mpris2Controller(PlayerController ctrl) { Object(owner: ctrl); @@ -86,7 +85,7 @@ public class Mpris2Controller : GLib.Object } public void property_changed(Object mpris_player, ParamSpec new_status){ - debug("playback status changed, %s", new_status.get_name()); + debug("playback status changed, %s", new_status.get_name()); } public bool was_successfull(){ @@ -153,8 +152,7 @@ public class Mpris2Controller : GLib.Object } public void set_position(double position) - { - /* + { debug("Set position with pos (0-100) %f", position); HashTable data = this.mpris2_player.Metadata; Value? time_value = data.lookup("time"); @@ -175,9 +173,8 @@ public class Mpris2Controller : GLib.Object else if(v.holds (typeof (string))){ debug("the trackid = %s", v.get_string()); } - } - - //this.mpris2_player.SetPosition((int32)(new_time_position)); + } + /*this.mpris2_player.SetPosition((int32)(new_time_position)); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris2_player.Position); */ @@ -187,8 +184,7 @@ public class Mpris2Controller : GLib.Object { return (this.mpris2_player != null); } - - + } -- cgit v1.2.3 From 7aa4517861e27a0857d36e83844d670446c22ee6 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 17 Aug 2010 17:26:47 +0100 Subject: mpris 2 has landed --- src/mpris2-controller.vala | 171 ++++++++++++++++++++++++++++++++------------- 1 file changed, 123 insertions(+), 48 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index cfe0d68..c5ca0a5 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -17,9 +17,10 @@ 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 . */ +using DBus; [DBus (name = "org.mpris.MediaPlayer2")] -public interface MprisRoot : Object { +public interface MprisRoot : DBus.Object { // properties public abstract bool HasTracklist{owned get; set;} public abstract bool CanQuit{owned get; set;} @@ -32,19 +33,25 @@ public interface MprisRoot : Object { } [DBus (name = "org.mpris.MediaPlayer2.Player")] -public interface MprisPlayer : Object { +public interface MprisPlayer : DBus.Object { public abstract HashTable Metadata{owned get; set;} public abstract int32 Position{owned get; set;} public abstract string PlaybackStatus{owned get; set;} - public abstract void SetPosition(string prop, int32 pos) throws DBus.Error; + public abstract void SetPosition(DBus.ObjectPath path, int64 pos) throws DBus.Error; public abstract void PlayPause() throws DBus.Error; public abstract void Pause() throws DBus.Error; public abstract void Next() throws DBus.Error; public abstract void Previous() throws DBus.Error; - public signal void Seeked(int new_position); + public signal void Seeked(int64 new_position); + //public signal void PropertiesChanged(string source, HashTable changed_properties, string[] invalid); +} + +[DBus (name = "org.freedesktop.DBus.Properties")] +public interface FreeDesktopProperties : DBus.Object{ + public signal void PropertiesChanged(string source, HashTable changed_properties, string[] invalid); } /* @@ -55,12 +62,13 @@ public class Mpris2Controller : GLib.Object { public static const string root_interface = "org.mpris.MediaPlayer2" ; public MprisRoot mpris2_root {get; construct;} - public MprisPlayer mpris2_player {get; construct;} - public PlayerController owner {get; construct;} + public MprisPlayer player {get; construct;} + public PlayerController owner {get; construct;} + public FreeDesktopProperties properties_interface {get; construct;} public Mpris2Controller(PlayerController ctrl) { - Object(owner: ctrl); + GLib.Object(owner: ctrl); } construct{ @@ -69,35 +77,68 @@ public class Mpris2Controller : GLib.Object this.mpris2_root = (MprisRoot) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()), "/org/mpris/MediaPlayer2", root_interface); - this.mpris2_player = (MprisPlayer) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()), - "/org/mpris/MediaPlayer2/Player", - root_interface.concat(".Player")); - this.mpris2_player.Seeked += onSeeked; - this.mpris2_player.notify["PlaybackStatus"].connect (property_changed); + this.player = (MprisPlayer) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2", + root_interface.concat(".Player")); + this.player.Seeked += onSeeked; + + this.properties_interface = (FreeDesktopProperties) connection.get_object(root_interface.concat(".").concat(this.owner.name.down()), + "/org/mpris/MediaPlayer2", + "org.freedesktop.DBus.Properties"); + this.properties_interface.PropertiesChanged += property_changed_cb; } catch (DBus.Error e) { error("Problems connecting to the session bus - %s", e.message); } } - public void onSeeked(int position){ - debug("Seeked signal callback"); - } + public void property_changed_cb(string interface_source, HashTable changed_properties, string[] invalid ) + { + debug("properties-changed for interface %s", interface_source); + if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false){ + warning("Property-changed hash is null"); + return; + } + Value? play_v = changed_properties.lookup("PlaybackStatus"); + if(play_v != null){ + string state = play_v.get_string(); + debug("new playback state = %s", state); + int p = this.determine_play_state(state); + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); + (this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_playstate(p); + } + + Value? pos_v = changed_properties.lookup("Position"); + if(pos_v != null){ + int64 pos = pos_v.get_int64(); + debug("new position = %i", (int)pos); + (this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_position((int32)pos); + } - public void property_changed(Object mpris_player, ParamSpec new_status){ - debug("playback status changed, %s", new_status.get_name()); - } - - public bool was_successfull(){ - if(this.mpris2_root == null ||this.mpris2_player == null){ - return false; + Value? meta_v = changed_properties.lookup("Metadata"); + if(meta_v != null){ + debug("metadata is not empty"); + debug("artist : %s", this.player.Metadata.lookup("artist").get_string()); + this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.player.Metadata, + MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); + if((int)this.player.Metadata.lookup("artist").get_string().len() > 0 || + (int)this.player.Metadata.lookup("artist").get_string().len() > 0){ + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.player.Metadata, + ScrubMenuitem.attributes_format()); + } + (this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_playstate(this.determine_play_state(this.player.PlaybackStatus)); + } - return true; } - - private int determine_play_state(){ - string status = this.mpris2_player.PlaybackStatus; - if(status == "Playing"){ + + private int determine_play_state(string status){ + if(status == null) + return 1; + + if(status != null && status == "Playing"){ + debug("determine play state - state = %s", status); return 0; } return 1; @@ -105,17 +146,22 @@ public class Mpris2Controller : GLib.Object public void initial_update() { - int32 p = determine_play_state(); - debug("initial update - play state %i", p); + int32 status; + if(this.player.PlaybackStatus == null){ + status = 1; + } + else{ + status = determine_play_state(this.player.PlaybackStatus); + } + debug("initial update - play state %i", status); - (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); - this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris2_player.Metadata, + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(status); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.player.Metadata, MetadataMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris2_player.Metadata, + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.player.Metadata, ScrubMenuitem.attributes_format()); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.mpris2_player.Position); - + scrub.update_position(this.player.Position); } public void transport_event(TransportMenuitem.action command) @@ -124,7 +170,7 @@ public class Mpris2Controller : GLib.Object if(command == TransportMenuitem.action.PLAY_PAUSE){ debug("transport_event PLAY_PAUSE"); try{ - this.mpris2_player.PlayPause(); + this.player.PlayPause(); } catch(DBus.Error error){ warning("DBus Error calling the player objects PlayPause method %s", @@ -133,7 +179,7 @@ public class Mpris2Controller : GLib.Object } else if(command == TransportMenuitem.action.PREVIOUS){ try{ - this.mpris2_player.Previous(); + this.player.Previous(); } catch(DBus.Error error){ warning("DBus Error calling the player objects Previous method %s", @@ -142,7 +188,7 @@ public class Mpris2Controller : GLib.Object } else if(command == TransportMenuitem.action.NEXT){ try{ - this.mpris2_player.Next(); + this.player.Next(); } catch(DBus.Error error){ warning("DBus Error calling the player objects Next method %s", @@ -150,11 +196,14 @@ public class Mpris2Controller : GLib.Object } } } - + /** + TODO: SetPosition on the player object is not working with rhythmbox, + runtime error - "dbus function not supported" + */ public void set_position(double position) { debug("Set position with pos (0-100) %f", position); - HashTable data = this.mpris2_player.Metadata; + HashTable data = this.player.Metadata; Value? time_value = data.lookup("time"); if(time_value == null){ warning("Can't fetch the duration of the track therefore cant set the position"); @@ -165,26 +214,52 @@ public class Mpris2Controller : GLib.Object double new_time_position = total_time * position/100.0; debug("new position = %f", (new_time_position * 1000)); - Value? v = this.mpris2_player.Metadata.lookup("trackid"); + Value? v = this.player.Metadata.lookup("trackid"); if(v != null){ - if(v.holds (typeof (int))){ - debug("the trackid = %i", v.get_int()); - } - else if(v.holds (typeof (string))){ + if(v.holds (typeof (string))){ debug("the trackid = %s", v.get_string()); + DBus.ObjectPath path = new ObjectPath(v.get_string()); + try{ + this.player.SetPosition(path, (int64)(new_time_position * 1000)); + } + catch(DBus.Error error){ + warning("DBus Error calling the player objects SetPosition method %s", + error.message); + } } } - /*this.mpris2_player.SetPosition((int32)(new_time_position)); + } + + public void onSeeked(int64 position){ + debug("Seeked signal callback with pos = %i", (int)position/1000); ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.mpris2_player.Position); - */ + scrub.update_position((int32)position/1000); } public bool connected() { - return (this.mpris2_player != null); + return (this.player != null && this.mpris2_root != null); } + + public bool was_successfull(){ + if(this.mpris2_root == null ||this.player == null){ + return false; + } + return true; + } + + public void expose() + { + if(this.connected() == true){ + try{ + this.mpris2_root.Raise(); + } + catch(DBus.Error e){ + error("Exception thrown while calling root function Raise - %s", e.message); + } + } + } } -- cgit v1.2.3 From f18466945a43718111ec93a79f1936157b02ce3f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 17 Aug 2010 17:43:34 +0100 Subject: we have mpris 2 basic stuff working with rb perfectly --- src/mpris2-controller.vala | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index c5ca0a5..8b937b7 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -34,23 +34,24 @@ public interface MprisRoot : DBus.Object { [DBus (name = "org.mpris.MediaPlayer2.Player")] public interface MprisPlayer : DBus.Object { - + + // properties public abstract HashTable Metadata{owned get; set;} public abstract int32 Position{owned get; set;} public abstract string PlaybackStatus{owned get; set;} - + // methods public abstract void SetPosition(DBus.ObjectPath path, int64 pos) throws DBus.Error; public abstract void PlayPause() throws DBus.Error; public abstract void Pause() throws DBus.Error; public abstract void Next() throws DBus.Error; public abstract void Previous() throws DBus.Error; - + // signals public signal void Seeked(int64 new_position); - //public signal void PropertiesChanged(string source, HashTable changed_properties, string[] invalid); } [DBus (name = "org.freedesktop.DBus.Properties")] public interface FreeDesktopProperties : DBus.Object{ + // signals public signal void PropertiesChanged(string source, HashTable changed_properties, string[] invalid); } @@ -96,7 +97,7 @@ public class Mpris2Controller : GLib.Object { debug("properties-changed for interface %s", interface_source); if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false){ - warning("Property-changed hash is null"); + warning("Property-changed hash is null or this is an interface that concerns us"); return; } Value? play_v = changed_properties.lookup("PlaybackStatus"); @@ -160,8 +161,6 @@ public class Mpris2Controller : GLib.Object MetadataMenuitem.attributes_format()); this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.player.Metadata, ScrubMenuitem.attributes_format()); - ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.player.Position); } public void transport_event(TransportMenuitem.action command) -- cgit v1.2.3 From 4897f3ce524e6d91ecd0c70142556be0f29367b7 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 18 Aug 2010 11:57:27 +0100 Subject: ready for the merge --- src/mpris2-controller.vala | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/mpris2-controller.vala') diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index 8b937b7..65d881a 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -208,10 +208,11 @@ public class Mpris2Controller : GLib.Object warning("Can't fetch the duration of the track therefore cant set the position"); return; } - uint32 total_time = time_value.get_uint(); + // work in microseconds (scale up by 10 TTP-of 3) + uint32 total_time = time_value.get_uint() * 1000; debug("total time of track = %i", (int)total_time); double new_time_position = total_time * position/100.0; - debug("new position = %f", (new_time_position * 1000)); + debug("new position = %f", (new_time_position)); Value? v = this.player.Metadata.lookup("trackid"); if(v != null){ @@ -219,11 +220,11 @@ public class Mpris2Controller : GLib.Object debug("the trackid = %s", v.get_string()); DBus.ObjectPath path = new ObjectPath(v.get_string()); try{ - this.player.SetPosition(path, (int64)(new_time_position * 1000)); + //this.player.SetPosition(path, (int64)(new_time_position)); } - catch(DBus.Error error){ - warning("DBus Error calling the player objects SetPosition method %s", - error.message); + catch(DBus.Error e){ + error("DBus Error calling the player objects SetPosition method %s", + e.message); } } } -- cgit v1.2.3