29 namespace media = core::ubuntu::media;
39 gst_init(
nullptr,
nullptr);
59 media::Track::MetaData md;
63 [](
const GstTagList *list,
69 static const std::map<std::string, std::string> gstreamer_to_mpris_tag_lut =
71 {GST_TAG_ALBUM, media::Engine::Xesam::album()},
72 {GST_TAG_ALBUM_ARTIST, media::Engine::Xesam::album_artist()},
73 {GST_TAG_ARTIST, media::Engine::Xesam::artist()},
74 {GST_TAG_LYRICS, media::Engine::Xesam::as_text()},
75 {GST_TAG_COMMENT, media::Engine::Xesam::comment()},
76 {GST_TAG_COMPOSER, media::Engine::Xesam::composer()},
77 {GST_TAG_DATE, media::Engine::Xesam::content_created()},
78 {GST_TAG_ALBUM_VOLUME_NUMBER, media::Engine::Xesam::disc_number()},
79 {GST_TAG_GENRE, media::Engine::Xesam::genre()},
80 {GST_TAG_TITLE, media::Engine::Xesam::title()},
81 {GST_TAG_TRACK_NUMBER, media::Engine::Xesam::track_number()},
82 {GST_TAG_USER_RATING, media::Engine::Xesam::user_rating()}
85 auto md = static_cast<media::Track::MetaData*>(user_data);
88 switch(gst_tag_get_type(tag))
93 if (gst_tag_list_get_boolean(list, tag, &value))
100 if (gst_tag_list_get_int(list, tag, &value))
107 if (gst_tag_list_get_uint(list, tag, &value))
114 if (gst_tag_list_get_int64(list, tag, &value))
121 if (gst_tag_list_get_uint64(list, tag, &value))
128 if (gst_tag_list_get_float(list, tag, &value))
135 if (gst_tag_list_get_double(list, tag, &value))
142 if (gst_tag_list_get_string(list, tag, &value))
154 (gstreamer_to_mpris_tag_lut.count(tag) > 0 ? gstreamer_to_mpris_tag_lut.at(tag) : tag),
159 track_meta_data.set(std::make_tuple(playbin.uri(), md));
164 playbin.set_volume(new_volume.value);
169 state = Engine::State::ready;
186 is_video_source(false),
187 is_audio_source(false),
188 about_to_finish_connection(
189 playbin.signals.about_to_finish.connect(
193 on_state_changed_connection(
194 playbin.signals.on_state_changed.connect(
196 &
Private::on_playbin_state_changed,
198 std::placeholders::_1))),
199 on_tag_available_connection(
200 playbin.signals.on_tag_available.connect(
204 std::placeholders::_1))),
205 on_volume_changed_connection(
206 volume.changed().connect(
210 std::placeholders::_1))),
211 on_seeked_to_connection(
212 playbin.signals.on_seeked_to.connect(
216 std::placeholders::_1))),
217 on_end_of_stream_connection(
218 playbin.signals.on_end_of_stream.connect(
226 core::Property<Engine::State>
state;
227 core::Property<std::tuple<media::Track::UriType, media::Track::MetaData>>
track_meta_data;
230 core::Property<media::Engine::Volume>
volume;
249 cout <<
"Creating a new Engine instance in " << __PRETTY_FUNCTION__ << endl;
250 d->state = media::Engine::State::ready;
260 return d->meta_data_extractor;
270 d->playbin.set_uri(uri);
276 d->playbin.create_video_sink(texture_id);
281 auto result = d->playbin.set_state_and_wait(GST_STATE_PLAYING);
285 d->state = media::Engine::State::playing;
286 d->playback_status_changed(media::Player::PlaybackStatus::playing);
289 cout <<
"Engine: " <<
this << endl;
296 auto result = d->playbin.set_state_and_wait(GST_STATE_NULL);
300 d->state = media::Engine::State::stopped;
301 d->playback_status_changed(media::Player::PlaybackStatus::stopped);
309 auto result = d->playbin.set_state_and_wait(GST_STATE_PAUSED);
313 d->state = media::Engine::State::paused;
314 cout <<
"pause" << endl;
315 d->playback_status_changed(media::Player::PlaybackStatus::paused);
323 return d->playbin.seek(ts);
329 if (type == gstreamer::Playbin::MediaFileType::MEDIA_FILE_TYPE_VIDEO)
330 d->is_video_source.set(
true);
332 d->is_video_source.set(
false);
334 return d->is_video_source;
340 if (type == gstreamer::Playbin::MediaFileType::MEDIA_FILE_TYPE_AUDIO)
341 d->is_audio_source.set(
true);
343 d->is_audio_source.set(
false);
345 return d->is_audio_source;
350 d->position.set(d->playbin.position());
356 d->duration.set(d->playbin.duration());
370 const core::Property<std::tuple<media::Track::UriType, media::Track::MetaData>>&
373 return d->track_meta_data;
378 return d->about_to_finish;
388 return d->end_of_stream;
393 return d->playback_status_changed;
void on_tag_available(const gstreamer::Bus::Message::Detail::Tag &tag)
core::ScopedConnection on_state_changed_connection
bool open_resource_for_uri(const core::ubuntu::media::Track::UriType &uri)
const core::Property< core::ubuntu::media::Engine::Volume > & volume() const
core::Property< bool > is_video_source
const core::Signal< core::ubuntu::media::Player::PlaybackStatus > & playback_status_changed_signal() const
const core::Property< bool > & is_video_source() const
core::Signal< void > end_of_stream
void on_seeked_to(uint64_t value)
void on_about_to_finish()
const core::Property< State > & state() const
core::ScopedConnection on_seeked_to_connection
core::ScopedConnection on_end_of_stream_connection
gstreamer::Playbin playbin
bool seek_to(const std::chrono::microseconds &ts)
const core::Signal< uint64_t > & seeked_to_signal() const
struct gstreamer::Init init
void create_video_sink(uint32_t texture_id)
const core::Property< std::tuple< core::ubuntu::media::Track::UriType, core::ubuntu::media::Track::MetaData > > & track_meta_data() const
const core::Property< bool > & is_audio_source() const
void on_volume_changed(const media::Engine::Volume &new_volume)
const core::Property< uint64_t > & duration() const
core::ScopedConnection on_volume_changed_connection
const core::Signal< void > & about_to_finish_signal() const
const core::Signal< void > & end_of_stream_signal() const
core::Signal< uint64_t > seeked_to
std::shared_ptr< Engine::MetaDataExtractor > meta_data_extractor
void on_playbin_state_changed(const gstreamer::Bus::Message::Detail::StateChanged &state_change)
core::ScopedConnection on_tag_available_connection
const std::shared_ptr< MetaDataExtractor > & meta_data_extractor() const
core::Property< media::Engine::Volume > volume
core::ScopedConnection about_to_finish_connection
core::Property< Engine::State > state
core::Property< uint64_t > position
core::Property< std::tuple< media::Track::UriType, media::Track::MetaData > > track_meta_data
core::Signal< void > about_to_finish
core::Signal< media::Player::PlaybackStatus > playback_status_changed
const core::Property< uint64_t > & position() const
core::Property< bool > is_audio_source
core::Property< uint64_t > duration