31 #include <core/dbus/property.h> 32 #include <core/dbus/types/object_path.h> 33 #include <core/dbus/types/variant.h> 34 #include <core/dbus/types/stl/map.h> 35 #include <core/dbus/types/stl/vector.h> 46 const std::shared_ptr<media::Player>&
parent,
47 const dbus::Object::Ptr&
object)
55 object->get_signal<mpris::TrackList::Signals::TrackAdded>(),
56 object->get_signal<mpris::TrackList::Signals::TracksAdded>(),
57 object->get_signal<mpris::TrackList::Signals::TrackMoved>(),
58 object->get_signal<mpris::TrackList::Signals::TrackRemoved>(),
59 object->get_signal<mpris::TrackList::Signals::TrackListReset>(),
60 object->get_signal<mpris::TrackList::Signals::TrackListReplaced>(),
61 object->get_signal<mpris::TrackList::Signals::TrackChanged>()
67 std::shared_ptr<media::Player>
parent;
70 std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::CanEditTracks>>
can_edit_tracks;
71 std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::Tracks>>
tracks;
76 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackAdded, mpris::TrackList::Signals::TrackAdded::ArgumentType>
DBusTrackAddedSignal;
77 typedef core::dbus::Signal<mpris::TrackList::Signals::TracksAdded, mpris::TrackList::Signals::TracksAdded::ArgumentType>
DBusTracksAddedSignal;
78 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackMoved, mpris::TrackList::Signals::TrackMoved::ArgumentType>
DBusTrackMovedSignal;
79 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackRemoved, mpris::TrackList::Signals::TrackRemoved::ArgumentType>
DBusTrackRemovedSignal;
80 typedef core::dbus::Signal<
81 mpris::TrackList::Signals::TrackListReset,
82 mpris::TrackList::Signals::TrackListReset::ArgumentType>
84 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackListReplaced, mpris::TrackList::Signals::TrackListReplaced::ArgumentType>
DBusTrackListReplacedSignal;
85 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackChanged, mpris::TrackList::Signals::TrackChanged::ArgumentType>
DBusTrackChangedSignal;
87 Signals(
const std::shared_ptr<DBusTrackAddedSignal>& track_added,
88 const std::shared_ptr<DBusTracksAddedSignal>& tracks_added,
89 const std::shared_ptr<DBusTrackMovedSignal>& track_moved,
90 const std::shared_ptr<DBusTrackRemovedSignal>& track_removed,
91 const std::shared_ptr<DBusTrackListResetSignal>& track_list_reset,
92 const std::shared_ptr<DBusTrackListReplacedSignal>& track_list_replaced,
93 const std::shared_ptr<DBusTrackChangedSignal>& track_changed)
114 std::cout <<
"OnTrackAdded signal arrived via the bus." << std::endl;
120 std::cout <<
"OnTracksAdded signal arrived via the bus." << std::endl;
126 std::cout <<
"OnTrackMoved signal arrived via the bus." << std::endl;
132 std::cout <<
"OnTrackRemoved signal arrived via the bus." << std::endl;
136 dbus.on_track_list_reset->connect([
this](
void)
138 std::cout <<
"OnTrackListReset signal arrived via the bus." << std::endl;
144 std::cout <<
"OnTrackListReplaced signal arrived via the bus." << std::endl;
150 std::cout <<
"OnTrackChanged signal arrived via the bus." << std::endl;
179 const std::shared_ptr<media::Player>&
parent,
180 const core::dbus::Object::Ptr&
object)
181 : d(new
Private(this, parent, object))
191 return *d->can_edit_tracks;
201 auto op = d->object->invoke_method_synchronously<
202 mpris::TrackList::GetTracksMetadata,
203 std::map<std::string, std::string>>(id);
206 throw std::runtime_error(
"Problem querying meta data for track: " + op.error());
208 media::Track::MetaData md;
209 for(
auto pair : op.value())
211 md.
set(pair.first, pair.second);
218 auto op = d->object->invoke_method_synchronously<
219 mpris::TrackList::GetTracksUri,
223 throw std::runtime_error(
"Problem querying track for uri: " + op.error());
233 auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTrack,
void>(
240 if (op.error().name() ==
242 throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
244 throw media::Player::Errors::UriNotFound{op.error().print()};
246 throw std::runtime_error{op.error().print()};
252 auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTracks,
void>(
258 if (op.error().name() ==
260 throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
262 throw media::Player::Errors::UriNotFound{op.error().print()};
264 throw std::runtime_error{op.error().print()};
270 auto op = d->object->invoke_method_synchronously<mpris::TrackList::MoveTrack,
void>(id, to);
274 if (op.error().name() ==
276 throw media::TrackList::Errors::FailedToMoveTrack{};
277 else if (op.error().name() ==
279 throw media::TrackList::Errors::FailedToFindMoveTrackSource{op.error().print()};
280 else if (op.error().name() ==
282 throw media::TrackList::Errors::FailedToFindMoveTrackDest{op.error().print()};
284 throw std::runtime_error{op.error().print()};
294 auto op = d->object->invoke_method_synchronously<mpris::TrackList::RemoveTrack,
void>(
299 if (op.error().name() ==
301 throw media::TrackList::Errors::TrackNotFound{};
303 throw std::runtime_error{
"Problem removing track: " + op.error().print()};
309 auto op = d->object->invoke_method_synchronously<mpris::TrackList::GoTo,
void>(track);
312 throw std::runtime_error(
"Problem adding track: " + op.error());
329 auto op = d->object->invoke_method_synchronously<mpris::TrackList::Reset,
void>();
332 throw std::runtime_error(
"Problem resetting tracklist: " + op.error());
337 return d->signals.on_track_list_replaced;
342 return d->signals.on_track_added;
347 return d->signals.on_tracks_added;
352 return d->signals.on_track_moved;
357 return d->signals.on_track_removed;
362 return d->signals.on_track_list_reset;
367 return d->signals.on_track_changed;
372 return d->signals.on_go_to_track;
377 return d->signals.on_end_of_tracklist;
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name