aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConor Curran <conor.curran@canonical.com>2010-08-18 12:04:59 +0100
committerConor Curran <conor.curran@canonical.com>2010-08-18 12:04:59 +0100
commit88c0ff52c479c7ec7a70448fe17946ee5ff68d3d (patch)
tree5aa8c8001b5ea2f7417dd2bf962347e527581425
parent44d47d0c4d334ba3cd2b8d9bd34893ba8c3dedf9 (diff)
parent4897f3ce524e6d91ecd0c70142556be0f29367b7 (diff)
downloadayatana-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.ac3
-rw-r--r--src/Makefile.am4
-rw-r--r--src/indicator-sound.c14
-rw-r--r--src/indicator-sound.h4
-rw-r--r--src/metadata-widget.c6
-rw-r--r--src/mpris-bridge.vala70
-rw-r--r--src/mpris-controller.vala3
-rw-r--r--src/mpris2-controller.vala275
-rw-r--r--src/player-controller.vala99
-rw-r--r--src/scrub-menu-item.vala2
-rw-r--r--src/sound-service.c1
-rw-r--r--src/title-menu-item.vala3
-rw-r--r--src/transport-menu-item.vala2
-rw-r--r--tests/test-indicator-sound-dbus-client.c75
-rw-r--r--tests/test-indicator-sound-dbus-server.c24
-rw-r--r--tests/test-indicator-sound.c4
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 ();
}