diff options
author | Conor Curran <conor.curran@canonical.com> | 2010-08-18 12:04:59 +0100 |
---|---|---|
committer | Conor Curran <conor.curran@canonical.com> | 2010-08-18 12:04:59 +0100 |
commit | 88c0ff52c479c7ec7a70448fe17946ee5ff68d3d (patch) | |
tree | 5aa8c8001b5ea2f7417dd2bf962347e527581425 | |
parent | 44d47d0c4d334ba3cd2b8d9bd34893ba8c3dedf9 (diff) | |
parent | 4897f3ce524e6d91ecd0c70142556be0f29367b7 (diff) | |
download | ayatana-indicator-sound-88c0ff52c479c7ec7a70448fe17946ee5ff68d3d.tar.gz ayatana-indicator-sound-88c0ff52c479c7ec7a70448fe17946ee5ff68d3d.tar.bz2 ayatana-indicator-sound-88c0ff52c479c7ec7a70448fe17946ee5ff68d3d.zip |
merge the mpris2 operational branch
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/indicator-sound.c | 14 | ||||
-rw-r--r-- | src/indicator-sound.h | 4 | ||||
-rw-r--r-- | src/metadata-widget.c | 6 | ||||
-rw-r--r-- | src/mpris-bridge.vala | 70 | ||||
-rw-r--r-- | src/mpris-controller.vala | 3 | ||||
-rw-r--r-- | src/mpris2-controller.vala | 275 | ||||
-rw-r--r-- | src/player-controller.vala | 99 | ||||
-rw-r--r-- | src/scrub-menu-item.vala | 2 | ||||
-rw-r--r-- | src/sound-service.c | 1 | ||||
-rw-r--r-- | src/title-menu-item.vala | 3 | ||||
-rw-r--r-- | src/transport-menu-item.vala | 2 | ||||
-rw-r--r-- | tests/test-indicator-sound-dbus-client.c | 75 | ||||
-rw-r--r-- | tests/test-indicator-sound-dbus-server.c | 24 | ||||
-rw-r--r-- | tests/test-indicator-sound.c | 4 |
16 files changed, 312 insertions, 277 deletions
diff --git a/configure.ac b/configure.ac index 7de494a..e75f751 100644 --- a/configure.ac +++ b/configure.ac @@ -35,8 +35,9 @@ PULSE_AUDIO_REQUIRED_VERSION=0.9.19 INDICATOR_DISPLAY_OBJECTS=0.1.11 INDICATE_REQUIRED_VERSION=0.4.1 DBUSMENUGLIB_REQUIRED_VERSION=0.3.1 +GIO_2_0_REQUIRED_VERSION=2.25.13 -PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION +PKG_CHECK_MODULES(APPLET,gtk+-2.0 >= $GTK_REQUIRED_VERSION indicator >= $INDICATOR_REQUIRED_VERSION dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS) diff --git a/src/Makefile.am b/src/Makefile.am index 0e22fe4..74e0297 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -65,6 +65,7 @@ music_bridge_VALASOURCES = \ scrub-menu-item.vala \ title-menu-item.vala \ player-controller.vala \ + mpris-bridge.vala \ mpris-controller.vala \ mpris2-controller.vala \ player-item.vala \ @@ -82,7 +83,8 @@ music_bridge_VALAFLAGS = \ --pkg Dbusmenu-Glib-0.2 \ --pkg common-defs \ --pkg dbus-glib-1 \ - --pkg gio-unix-2.0 + --pkg gio-unix-2.0 + $(MAINTAINER_VALAFLAGS) music_bridge_APIFILES = \ diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 557ce85..3a7abe9 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -32,11 +32,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <dbus/dbus-glib.h> #include <dbus/dbus-glib-bindings.h> -#include <libindicator/indicator.h> -#include <libindicator/indicator-object.h> -#include <libindicator/indicator-service-manager.h> -#include <libindicator/indicator-image-helper.h> - #include "indicator-sound.h" #include "transport-widget.h" #include "metadata-widget.h" @@ -236,15 +231,6 @@ free_the_animation_list() } } -/*static void -slider_parent_changed (GtkWidget *widget, - gpointer user_data) -{ - gtk_widget_set_size_request (widget, 200, -1); - g_debug("slider parent changed"); -}*/ - - static gboolean new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { diff --git a/src/indicator-sound.h b/src/indicator-sound.h index 251295c..9f829bb 100644 --- a/src/indicator-sound.h +++ b/src/indicator-sound.h @@ -23,6 +23,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 <http://www.gnu.org/licenses/>. */ +#include <libindicator/indicator.h> +#include <libindicator/indicator-object.h> +#include <libindicator/indicator-service-manager.h> +#include <libindicator/indicator-image-helper.h> #define INDICATOR_SOUND_TYPE (indicator_sound_get_type ()) #define INDICATOR_SOUND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_SOUND_TYPE, IndicatorSound)) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 670d983..aaf71e2 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -150,8 +150,8 @@ metadata_widget_init (MetadataWidget *self) g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_property_update), self); gtk_widget_show_all (priv->hbox); - gtk_container_add (GTK_CONTAINER (self), hbox); - + gtk_widget_set_size_request(GTK_WIDGET(self), 200, 60); + gtk_container_add (GTK_CONTAINER (self), hbox); } static gboolean @@ -201,11 +201,9 @@ metadata_widget_property_update(DbusmenuMenuitem* item, gchar* property, if(g_value_get_int(value) == DBUSMENU_PROPERTY_EMPTY){ g_debug("Metadata widget: property update - reset"); - gchar* empty = ""; GValue new_value = {0}; g_value_init(&new_value, G_TYPE_STRING); g_value_set_string(&new_value, g_strdup("")); - //g_free(empty); value = &new_value; } diff --git a/src/mpris-bridge.vala b/src/mpris-bridge.vala new file mode 100644 index 0000000..bd9d472 --- /dev/null +++ b/src/mpris-bridge.vala @@ -0,0 +1,70 @@ +public class MprisBridge : GLib.Object +{ + private MprisController mpris1_controller; + private Mpris2Controller mpris2_controller; + private enum mode{ + MPRIS_1, + MPRIS_2 + } + private mode mode_in_use; + + public MprisBridge(PlayerController ctrl) + { + this.mpris2_controller = new Mpris2Controller(ctrl); + if(this.mpris2_controller.was_successfull() == true){ + this.mode_in_use = mode.MPRIS_2; + this.mpris1_controller = null; + this.mpris2_controller.initial_update(); + } + else{ + this.mpris2_controller = null; + this.mode_in_use = mode.MPRIS_1; + this.mpris1_controller = new MprisController(ctrl); + } + } + + // The handling of both mpris controllers can be abstracted further + // once the mpris2 is implemented. This will allow for one instance + // variable to point at the active controller. For now handle both ... + public bool connected() + { + if(this.mode_in_use == mode.MPRIS_1){ + return this.mpris1_controller.connected(); + } + else if(this.mode_in_use == mode.MPRIS_2){ + return this.mpris2_controller.connected(); + } + return false; + } + + public void transport_update(TransportMenuitem.action update) + { + if(this.mode_in_use == mode.MPRIS_1){ + this.mpris1_controller.transport_event(update); + } + else if(this.mode_in_use == mode.MPRIS_2){ + this.mpris2_controller.transport_event(update); + } + } + + public void expose() + { + if(this.mode_in_use == mode.MPRIS_2){ + this.mpris2_controller.expose(); + } + else{ + warning("MPRIS1 clients don't have the ability to raise/expose the client"); + } + } + + + public void set_track_position(double pos) + { + if(this.mode_in_use == mode.MPRIS_1){ + this.mpris1_controller.set_position(pos); + } + else if(this.mode_in_use == mode.MPRIS_2){ + this.mpris2_controller.set_position(pos); + } + } +}
\ No newline at end of file diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index c70c6d5..1e1e00a 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -63,7 +63,6 @@ public class MprisController : GLib.Object MetadataMenuitem.attributes_format()); this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(), ScrubMenuitem.attributes_format()); - // temporary fix ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; scrub.update_position(this.mpris_player.PositionGet()); } @@ -127,7 +126,7 @@ public class MprisController : GLib.Object this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); - HashTable<string, Value?> status_hash = new HashTable<string, Value?>(str_hash, str_equal); + //HashTable<string, Value?> status_hash = new HashTable<string, Value?>(str_hash, str_equal); status st = this.mpris_player.GetStatus(); int play_state = st.playback; diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index 20cfc9e..65d881a 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -17,32 +17,42 @@ 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 Gee; +using DBus; -[DBus (name = "org.mpris.MediaPlayer.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<string, Value?> Metadata{owned get;} - public abstract double Volume{get;} - public abstract int32 Capabilities{get;} - public abstract int32 Position{get;} - - public abstract void SetPosition(string prop, int32 pos) throws DBus.Error; +[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 void Quit() throws DBus.Error; + public abstract 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 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 abstract signal void StatusChanged(Status update); - public abstract signal void TrackChanged(HashTable<string,Value?> Metadata); +[DBus (name = "org.freedesktop.DBus.Properties")] +public interface FreeDesktopProperties : DBus.Object{ + // signals + public signal void PropertiesChanged(string source, HashTable<string, Value?> changed_properties, string[] invalid); } /* @@ -51,51 +61,106 @@ public interface MprisPlayer : Object { */ public class Mpris2Controller : GLib.Object { - private DBus.Connection connection; - public dynamic DBus.Object mpris2_root {get; construct;} - public MprisPlayer mpris2_player {get; construct;} - public PlayerController owner {get; construct;} + 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) { - Object(owner: ctrl); + GLib.Object(owner: ctrl); } construct{ try { - debug("going to create this mpris 2 controller"); - this.connection = DBus.Bus.get (DBus.BusType.SESSION); - } catch (Error e) { + 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.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); } - 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(); + } + + public void property_changed_cb(string interface_source, HashTable<string, Value?> 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 or this is an interface that concerns us"); + 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); + } + + 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)); + + } + } + + 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; } - private void initial_update() + public void initial_update() { - bool r = (bool)this.mpris2_player.Status.Shuffle_State; - int32 p = (int32)this.mpris2_player.Status.Playback_State; - - debug("initial update - play state %i", p); - debug("initial update - shuffle state %s", r.to_string()); + 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); - } public void transport_event(TransportMenuitem.action command) @@ -103,80 +168,98 @@ 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.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.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.player.Next(); + } + catch(DBus.Error error){ + warning("DBus Error calling the player objects Next method %s", + error.message); + } + } } - + /** + 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<string, Value?> data = this.mpris2_player.Metadata; + HashTable<string, Value?> 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"); 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.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)); + } + catch(DBus.Error e){ + error("DBus Error calling the player objects SetPosition method %s", + e.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); } - - private void onStatusChanged(MprisPlayer.Status st) - { - debug("onStatusChange - play state %i", st.Playback_State); - HashTable<string, Value?> ht = new HashTable<string, Value?>(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()); + + + public bool was_successfull(){ + if(this.mpris2_root == null ||this.player == null){ + return false; + } + return true; } - - private void onTrackChanged(HashTable<string,Value?> ht) + + public void expose() { - 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); + if(this.connected() == true){ + try{ + this.mpris2_root.Raise(); + } + catch(DBus.Error e){ + error("Exception thrown while calling root function Raise - %s", e.message); + } } - 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); } - } diff --git a/src/player-controller.vala b/src/player-controller.vala index 33a5b1a..2aa4382 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -23,7 +23,7 @@ using Gee; public class PlayerController : GLib.Object { - public const int WIDGET_QUANTITY = 6; + public const int WIDGET_QUANTITY = 5; public static enum widget_order{ SEPARATOR, @@ -31,7 +31,6 @@ public class PlayerController : GLib.Object METADATA, SCRUB, TRANSPORT, - PLAYLIST } public enum state{ @@ -43,20 +42,16 @@ public class PlayerController : GLib.Object } public int current_state = state.OFFLINE; - - + private Dbusmenu.Menuitem root_menu; public string name { get; set;} public ArrayList<PlayerItem> custom_items; - public Mpris2Controller mpris2_adaptor; - public MprisController mpris_adaptor; - public bool mpris2; + public MprisBridge mpris_bridge; public AppInfo? app_info { get; set;} public int menu_offset { get; set;} public PlayerController(Dbusmenu.Menuitem root, string client_name, int offset, state initial_state) { - this.mpris2 = false; this.root_menu = root; this.name = format_client_name(client_name.strip()); this.custom_items = new ArrayList<PlayerItem>(); @@ -77,7 +72,6 @@ public class PlayerController : GLib.Object public void activate() { this.establish_mpris_connection(); - //this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, true); } /* @@ -104,14 +98,7 @@ public class PlayerController : GLib.Object debug("establish_mpris_connection - Not ready to connect"); return; } - if(this.name == "Vlc"){ - debug("establishing a vlc mpris controller"); - this.mpris2_adaptor = new Mpris2Controller(this); - this.mpris2 = true; - } - else{ - this.mpris_adaptor = new MprisController(this); - } + this.mpris_bridge = new MprisBridge(this); this.determine_state(); } @@ -140,25 +127,14 @@ public class PlayerController : GLib.Object false); this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, false); - this.custom_items[widget_order.PLAYLIST].property_set_bool(MENUITEM_PROP_VISIBLE, - false); return; } - debug("update layout - metadata %s", this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()).to_string()); this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, - this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format())); - //debug("metadata id %i", this.custom_items[widget_order.METADATA].id); - - debug("update layout - scrub %s", this.custom_items[widget_order.SCRUB].populated(ScrubMenuitem.attributes_format()).to_string()); + this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format())); this.custom_items[widget_order.SCRUB].property_set_bool(MENUITEM_PROP_VISIBLE, this.custom_items[widget_order.SCRUB].populated(ScrubMenuitem.attributes_format())); - - this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE, true); - - this.custom_items[widget_order.PLAYLIST].property_set_bool(MENUITEM_PROP_VISIBLE, - true); } private void construct_widgets() @@ -181,34 +157,11 @@ public class PlayerController : GLib.Object // Transport item TransportMenuitem transport_item = new TransportMenuitem(this); this.custom_items.add(transport_item); - - this.custom_items.add(create_playlist()); - + foreach(PlayerItem item in this.custom_items){ root_menu.child_add_position(item, this.menu_offset + this.custom_items.index_of(item)); } } - - private PlayerItem create_playlist() - { - PlayerItem playlist_root = new PlayerItem(CLIENT_TYPES_DEFAULT); - playlist_root.property_set(MENUITEM_PROP_LABEL, "Choose Playlist"); - - PlayerItem subentry_1 = new PlayerItem(CLIENT_TYPES_DEFAULT); - subentry_1.property_set(MENUITEM_PROP_LABEL, "Raster-noton selection"); - - PlayerItem subentry_2 = new PlayerItem(CLIENT_TYPES_DEFAULT); - subentry_2.property_set(MENUITEM_PROP_LABEL, "Rune Grammofon selection"); - - PlayerItem subentry_3 = new PlayerItem(CLIENT_TYPES_DEFAULT); - subentry_3.property_set(MENUITEM_PROP_LABEL, "Kranky selection"); - - playlist_root.child_append(subentry_1); - playlist_root.child_append(subentry_2); - playlist_root.child_append(subentry_3); - - return playlist_root; - } private static string format_client_name(string client_name) { @@ -223,45 +176,13 @@ public class PlayerController : GLib.Object // Temporarily we will need to handle to different mpris implemenations // Do it for now - a couple of weeks should see this messy carry on out of // the codebase. - public void set_track_position(double pos) - { - if(this.mpris2 == true){ - this.mpris2_adaptor.set_position(pos); - } - else{ - this.mpris_adaptor.set_position(pos); - } - } - - public void transport_update(TransportMenuitem.action update) - { - if(this.mpris2 == true){ - this.mpris2_adaptor.transport_event(update); - } - else{ - this.mpris_adaptor.transport_event(update); - } - } - public void determine_state() { - if(this.mpris2 == true){ - if(this.mpris2_adaptor.connected() == true){ - debug("yup I'm connected"); - this.update_state(state.CONNECTED); - } - else{ - this.update_state(state.DISCONNECTED); - } + if(this.mpris_bridge.connected() == true){ + this.update_state(state.CONNECTED); } else{ - if(this.mpris_adaptor.connected() == true){ - debug("yup I'm connected"); - this.update_state(state.CONNECTED); - } - else{ - this.update_state(state.DISCONNECTED); - } - } + this.update_state(state.DISCONNECTED); + } } }
\ No newline at end of file diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala index e220612..7368a0c 100644 --- a/src/scrub-menu-item.vala +++ b/src/scrub-menu-item.vala @@ -32,7 +32,7 @@ public class ScrubMenuitem : PlayerItem public override void handle_event(string name, GLib.Value input_value, uint timestamp) { debug("handle_event for owner %s with value: %f", this.owner.name, input_value.get_double()); - this.owner.set_track_position(input_value.get_double()); + this.owner.mpris_bridge.set_track_position(input_value.get_double()); } public void update_position(int32 new_position) diff --git a/src/sound-service.c b/src/sound-service.c index 8768cd3..12f067e 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -25,7 +25,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>. static GMainLoop *mainloop = NULL; - /**********************************************************************************************************************/ // Init and exit functions /**********************************************************************************************************************/ diff --git a/src/title-menu-item.vala b/src/title-menu-item.vala index d7e16df..ec1cc62 100644 --- a/src/title-menu-item.vala +++ b/src/title-menu-item.vala @@ -35,6 +35,9 @@ public class TitleMenuitem : PlayerItem { this.owner.instantiate(); } + else if(this.owner.current_state == PlayerController.state.CONNECTED){ + this.owner.mpris_bridge.expose(); + } } diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 45c2692..8bdd2c8 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -45,7 +45,7 @@ public class TransportMenuitem : PlayerItem int input = input_value.get_int(); debug("handle_event with value %s", input.to_string()); debug("transport owner name = %s", this.owner.name); - this.owner.transport_update((action)input); + this.owner.mpris_bridge.transport_update((action)input); } public static HashSet<string> attributes_format() diff --git a/tests/test-indicator-sound-dbus-client.c b/tests/test-indicator-sound-dbus-client.c index 1c23dc5..265a36d 100644 --- a/tests/test-indicator-sound-dbus-client.c +++ b/tests/test-indicator-sound-dbus-client.c @@ -21,7 +21,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ - #include <glib.h> #include <dbus/dbus-glib.h> #include "../src/dbus-shared-names.h" @@ -34,59 +33,42 @@ static DBusGProxy * proxy= NULL; static void test_fetch_mute(DBusGProxy * proxy) { - GError * error = NULL; - gboolean *fetched_mute_value; - fetched_mute_value = g_new0(gboolean, 1); - org_ayatana_indicator_sound_get_sink_mute(proxy, fetched_mute_value, &error); + GError * error = NULL; + gboolean *fetched_mute_value; + fetched_mute_value = g_new0(gboolean, 1); + org_ayatana_indicator_sound_get_sink_mute(proxy, fetched_mute_value, &error); if (error != NULL) { g_warning("test-indicator-sound-dbus-client::test_fetch_mute - Unable to fetch mute: %s", error->message); g_error_free(error); - g_free(fetched_mute_value); - return; - } - g_assert(TEST_MUTE_VALUE == *fetched_mute_value); g_free(fetched_mute_value); + return; + } + g_assert(TEST_MUTE_VALUE == *fetched_mute_value); + g_free(fetched_mute_value); } -static void -test_fetch_volume(DBusGProxy * proxy) +static void +test_fetch_availability(DBusGProxy * proxy) { GError * error = NULL; - gdouble *volume_percent_input; - volume_percent_input = g_new0(gdouble, 1); - org_ayatana_indicator_sound_get_sink_volume(proxy, volume_percent_input, &error); + gboolean * available_input; + available_input = g_new0(gboolean, 1); + org_ayatana_indicator_sound_get_sink_availability(proxy, available_input, &error); if (error != NULL) { - g_warning("test-indicator-sound-dbus-client::test_fetch_volume - Unable to fetch VOLUME: %s", error->message); + g_warning("test-indicator-sound-dbus-client::test_fetch_availability - unable to fetch availability %s", error->message); g_error_free(error); - g_free(volume_percent_input); - return; + g_free(available_input); + return; } - g_assert(TEST_VOLUME_VALUE == *volume_percent_input); - g_free(volume_percent_input); -} - -static void -test_fetch_availability(DBusGProxy * proxy) -{ - GError * error = NULL; - gboolean * available_input; - available_input = g_new0(gboolean, 1); - org_ayatana_indicator_sound_get_sink_availability(proxy, available_input, &error); - if (error != NULL) { - g_warning("test-indicator-sound-dbus-client::test_fetch_availability - unable to fetch availability %s", error->message); - g_error_free(error); - g_free(available_input); - return; - } - g_assert(TEST_AVAILABLE_VALUE == *available_input); - g_free(available_input); + g_assert(TEST_AVAILABLE_VALUE == *available_input); + g_free(available_input); } gboolean kill_func (gpointer userdata) { - g_free(proxy); + g_free(proxy); g_main_loop_quit(mainloop); return FALSE; } @@ -107,24 +89,17 @@ main (gint argc, gchar * argv[]) } DBusGProxy * proxy = dbus_g_proxy_new_for_name_owner(session_bus, - ":1.0", - INDICATOR_SOUND_SERVICE_DBUS_OBJECT, - INDICATOR_SOUND_SERVICE_DBUS_INTERFACE, - &error); + ":1.0", + INDICATOR_SOUND_SERVICE_DBUS_OBJECT, + INDICATOR_SOUND_SERVICE_DBUS_INTERFACE, + &error); if (error != NULL) { g_error("Unable to get property proxy: %s", error->message); return 1; } -/* g_test_add_func("/test-indicator-sound-dbus/test-fetch-mute", test_fetch_mute);*/ -/* g_test_add_func("/test-indicator-sound-dbus/test-fetch-volume", test_fetch_volume);*/ -/* g_test_add_func("/test-indicator-sound-dbus/test-fetch-availability", test_fetch_availability);*/ -/* g_test_queue_free(proxy);*/ -/* return g_test_run();*/ - - test_fetch_mute(proxy); - test_fetch_volume(proxy); - test_fetch_availability(proxy); + test_fetch_mute(proxy); + test_fetch_availability(proxy); g_timeout_add_seconds(2, kill_func, NULL); diff --git a/tests/test-indicator-sound-dbus-server.c b/tests/test-indicator-sound-dbus-server.c index 6912dc4..b1e3d9c 100644 --- a/tests/test-indicator-sound-dbus-server.c +++ b/tests/test-indicator-sound-dbus-server.c @@ -35,33 +35,29 @@ gboolean kill_func (gpointer userdata) { g_main_loop_quit(mainloop); - // TODO free the dbus interface !! return FALSE; } gint main (gint argc, gchar * argv[]) { - g_type_init(); - - //g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); + g_type_init(); - dbus_interface = g_object_new(SOUND_SERVICE_DBUS_TYPE, NULL); + dbus_interface = g_object_new(SOUND_SERVICE_DBUS_TYPE, NULL); - // Set the mute value - sound_service_dbus_update_sink_mute(dbus_interface, TEST_MUTE_VALUE); - sound_service_dbus_update_sink_volume(dbus_interface, TEST_VOLUME_VALUE); - sound_service_dbus_update_sink_availability(dbus_interface, TEST_AVAILABLE_VALUE); + // Set the mute value + sound_service_dbus_update_sink_mute(dbus_interface, TEST_MUTE_VALUE); + sound_service_dbus_update_sink_availability(dbus_interface, TEST_AVAILABLE_VALUE); - g_timeout_add_seconds(4, kill_func, NULL); + g_timeout_add_seconds(4, kill_func, NULL); - // Run the loop - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); + // Run the loop + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); g_debug("Quiting"); - return 0; + return 0; } diff --git a/tests/test-indicator-sound.c b/tests/test-indicator-sound.c index cd28587..e5d4657 100644 --- a/tests/test-indicator-sound.c +++ b/tests/test-indicator-sound.c @@ -91,9 +91,7 @@ gint main (gint argc, gchar * argv[]) g_type_init(); g_test_init(&argc, &argv, NULL); -/* g_test_add_func("/indicator-sound/indicator-sound/init", test_libindicator_sound_init);*/ -/* g_test_add_func("/indicator-sound/indicator-sound/state_machine", test_libindicator_determine_state);*/ - g_test_add_func("/indicator-sound/indicator-sound/image_names", test_libindicator_image_names); + g_test_add_func("/indicator-sound/indicator-sound/image_names", test_libindicator_image_names); return g_test_run (); } |