From 85a7764a2aeba260e2a2531dd28be66ec0680d6f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Sat, 7 Aug 2010 12:03:26 +0100 Subject: starting on the re write for mpris handling --- src/mpris-controller-v2.vala | 28 --------- src/mpris2-controller.vala | 139 +++++++++++++++++++++++++++++++++++++++++++ src/player-controller.vala | 1 + src/sound-service.c | 4 +- 4 files changed, 142 insertions(+), 30 deletions(-) delete mode 100644 src/mpris-controller-v2.vala create mode 100644 src/mpris2-controller.vala diff --git a/src/mpris-controller-v2.vala b/src/mpris-controller-v2.vala deleted file mode 100644 index efb5084..0000000 --- a/src/mpris-controller-v2.vala +++ /dev/null @@ -1,28 +0,0 @@ -/* -This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. -Copyright 2010 Canonical Ltd. - -Authors: - Conor Curran - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -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; - -public class MprisControllerV2 : MprisController -{ - public MprisControllerV2(PlayerController ctrl, string inter="org.mpris.MediaPlayer.Player"){ - Object(owner: ctrl, mpris_interface: inter); - } - -} diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala new file mode 100644 index 0000000..4430776 --- /dev/null +++ b/src/mpris2-controller.vala @@ -0,0 +1,139 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +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; +/* + This class will entirely replace mpris-controller.vala hence why there is no + point in trying to get encorporate both into the same object model. + */ +public class Mpris2Controller +{ + private DBus.Connection connection; + public dynamic DBus.Object mpris_root + public dynamic DBus.Object mpris_player + public PlayerController owner {get; construct;} + + public Mpris2Controller(PlayerController ctrl) + { + Object(owner: ctrl); + } + + construct{ + try { + this.connection = DBus.Bus.get (DBus.BusType.SESSION); + } catch (Error e) { + error("Problems connecting to the session bus - %s", e.message); + } + this.mpris_root = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()), + "/org/mpris/MediaPlayer", + "org.mpris.MediaPlayer"); + + this.mpris_player = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()) , + "/org/mpris/MediaPlayer/Player", + "org.mpris.MediaPlayer.Player"); + + + this.mpris_player.TrackChange += onTrackChange; + this.mpris_player.StatusChange += onStatusChange; + initial_update(); + } + + private void initial_update() + { + status st = this.mpris_player.Status; + int play_state = st.playback; + debug("GetStatusChange - play state %i", play_state); + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(play_state); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris_player.GetMetadata(), + 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()); + } + + 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"); + this.mpris_player.Pause(); + } + else if(command == TransportMenuitem.action.PREVIOUS){ + this.mpris_player.Prev(); + } + else if(command == TransportMenuitem.action.NEXT){ + this.mpris_player.Next(); + } + } + + public void set_position(double position) + { + debug("Set position with pos (0-100) %f", position); + HashTable data = this.mpris_player.GetMetadata(); + 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(); + 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)); + this.mpris_player.PositionSet((int32)(new_time_position)); + ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; + scrub.update_position(this.mpris_player.PositionGet()); + } + + public bool connected() + { + return (this.mpris_player != null); + } + + private void onStatusChange(dynamic DBus.Object mpris_client, status st) + { + debug("onStatusChange - signal received"); + status* status = &st; + unowned ValueArray ar = (ValueArray)status; + int play_state = ar.get_nth(0).get_int(); + debug("onStatusChange - play state %i", play_state); + HashTable ht = new HashTable(str_hash, str_equal); + Value v = Value(typeof(int)); + v.set_int(play_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 onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) + { + debug("onTrackChange"); + 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"); + 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()); + } +} diff --git a/src/player-controller.vala b/src/player-controller.vala index fc5ca9b..1dac937 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -102,6 +102,7 @@ public class PlayerController : GLib.Object return; } + if(this.name == "Vlc"){ debug("establishing a vlc mpris controller"); this.mpris_adaptor = new MprisController(this, "org.mpris.MediaPlayer.Player"); diff --git a/src/sound-service.c b/src/sound-service.c index 8768cd3..16fa87c 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -42,8 +42,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); // TODO: uncomment for release !! - close_pulse_activites(); - g_main_loop_quit(mainloop); + //close_pulse_activites(); + //g_main_loop_quit(mainloop); } return; } -- cgit v1.2.3