aboutsummaryrefslogtreecommitdiff
path: root/src/mpris2-controller.vala
diff options
context:
space:
mode:
authorKen VanDine <ken.vandine@canonical.com>2010-12-16 20:30:00 -0500
committerKen VanDine <ken.vandine@canonical.com>2010-12-16 20:30:00 -0500
commit370d15ea33974c3a8339965263980b21403f21ca (patch)
treeabab621ef062d725394be236c5cfa25a2124c60e /src/mpris2-controller.vala
parentce000aacc3fe96dae098fbea9bbc639e08ddf632 (diff)
parent2565fc2f86a1c81780ca8bcdb1f568b56031fa5a (diff)
downloadayatana-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.vala282
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