/** @file * @author Edouard DUPIN * @copyright 2011, Edouard DUPIN, all right reserved * @license MPL v2.0 (see license file) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include appl::widget::Player::Player() : signalFinished(this, "finish", "The playing of the stream is finished"), signalNext(this, "next", "User request the next stream"), signalPrevious(this, "previous", "User request the previous stream") { addObjectType("appl::widget::Player"); } void appl::widget::Player::init() { ewol::widget::Composer::init(); if (*propertySubFile == "") { propertySubFile.set("DATA:///gui-player.xml"); } subBind(ewol::widget::Button, "[" + etk::toString(getId()) + "]appl-player-bt-previous", signalPressed, sharedFromThis(), &appl::widget::Player::onCallbackButtonPrevious); subBind(ewol::widget::Button, "[" + etk::toString(getId()) + "]appl-player-bt-play", signalValue, sharedFromThis(), &appl::widget::Player::onCallbackButtonPlay); subBind(ewol::widget::Button, "[" + etk::toString(getId()) + "]appl-player-bt-next", signalPressed, sharedFromThis(), &appl::widget::Player::onCallbackButtonNext); subBind(appl::widget::VideoDisplay, "[" + etk::toString(getId()) + "]appl-player-display", signalOther, sharedFromThis(), &appl::widget::Player::onCallbackOther); subBind(appl::widget::VideoDisplay, "[" + etk::toString(getId()) + "]appl-player-display", signalPosition, sharedFromThis(), &appl::widget::Player::onCallbackPosition); subBind(appl::widget::VideoDisplay, "[" + etk::toString(getId()) + "]appl-player-display", signalDuration, sharedFromThis(), &appl::widget::Player::onCallbackDuration); subBind(appl::widget::VideoDisplay, "[" + etk::toString(getId()) + "]appl-player-display", signalFinish, sharedFromThis(), &appl::widget::Player::onCallbackFinished); subBind(appl::widget::VideoDisplay, "[" + etk::toString(getId()) + "]appl-player-display", signalFps, sharedFromThis(), &appl::widget::Player::onCallbackFPS); subBind(appl::widget::ProgressBar, "[" + etk::toString(getId()) + "]appl-player-progress-bar", signalChange, sharedFromThis(), &appl::widget::Player::onCallbackSeekRequest); subBind(appl::widget::UpBar, "[" + etk::toString(getId()) + "]appl-player-volume", signalChange, sharedFromThis(), &appl::widget::Player::onCallbackVolumeRequest); subBind(appl::widget::UpBar, "[" + etk::toString(getId()) + "]appl-player-light", signalChange, sharedFromThis(), &appl::widget::Player::onCallbackLightRequest); m_display = ememory::dynamicPointerCast(getSubObjectNamed("[" + etk::toString(getId()) + "]appl-player-display")); m_progress = ememory::dynamicPointerCast(getSubObjectNamed("[" + etk::toString(getId()) + "]appl-player-progress-bar")); propertyCanFocus.set(true); markToRedraw(); } void appl::widget::Player::onGetFocus() { // transfert focus on a specific widget... propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-bt-play", "focus", "true"); } appl::widget::Player::~Player() { } void appl::widget::Player::playStream(ememory::SharedPtr _property, uint32_t _mediaId) { if (m_display == null) { return; } // stop previous (if needed) propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-bt-play", "value", "false"); m_display->stop(); // Set new file: m_display->setZeusMedia(_property, _mediaId); m_display->play(); propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-bt-play", "value", "true"); } static etk::String timeToStaticString(const echrono::Duration& _time) { float sec = _time.toSeconds(); int32_t millisecond = int32_t(sec*1000.0f)%999; int32_t seconds = int32_t(sec)%60; int32_t minutes = int32_t(sec/60)%60; int32_t hours = sec/3600; etk::String out; if (hours!=0) { out += etk::toString(hours) + ":"; } if (minutes<10) { out += " " + etk::toString(minutes) + "'"; } else { out += etk::toString(minutes) + "'"; } if (seconds<10) { out += " " + etk::toString(seconds) + "\""; } else { out += etk::toString(seconds) + "\""; } if (millisecond<10) { out += " 00" + etk::toString(millisecond); } else if (millisecond<100) { out += " 0" + etk::toString(millisecond); } else { out += etk::toString(millisecond); } return out; } void appl::widget::Player::onCallbackFinished() { if (m_progress != null) { etk::Vector> tmp; m_progress->setRangeAvaillable(tmp); m_progress->propertyValue.set(0); m_progress->propertyMaximum.set(0); } propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-time", "value", "--:--"); propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-duration", "value", "--:--"); signalFinished.emit(); } void appl::widget::Player::onCallbackDuration(const echrono::Duration& _time) { //APPL_ERROR("duration = " << _time); if (m_progress != null) { m_progress->propertyValue.set(0); m_progress->propertyMaximum.set(_time.toSeconds()); } propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-duration", "value", "" + timeToStaticString(_time) + ""); } void appl::widget::Player::onCallbackPosition(const echrono::Duration& _time) { //APPL_ERROR("time = " << _time); propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-time", "value", "" + timeToStaticString(_time) + ""); if (m_progress != null) { m_progress->propertyValue.set(_time.toSeconds()); } if (m_display != null) { etk::Vector> tmp = m_display->getDownloadPart(); if (m_progress != null) { m_progress->setRangeAvaillable(tmp); } } } void appl::widget::Player::onCallbackSeekRequest(const float& _value) { APPL_DEBUG("==========================================================================="); APPL_DEBUG("seek at = " << echrono::Duration(_value) << " from value=" << _value); APPL_DEBUG("==========================================================================="); if (m_display != null) { m_display->seek(echrono::Duration(_value)); } } void appl::widget::Player::onCallbackVolumeRequest(const float& _value) { APPL_DEBUG("==========================================================================="); APPL_DEBUG("volume change value=" << _value << " dB"); APPL_DEBUG("==========================================================================="); if (m_display != null) { m_display->changeVolume(_value); } } void appl::widget::Player::onCallbackLightRequest(const float& _value) { APPL_DEBUG("==========================================================================="); APPL_DEBUG("volume change value=" << _value << " %"); APPL_DEBUG("==========================================================================="); if (m_display != null) { m_display->changeLight(_value); } } void appl::widget::Player::onCallbackOther(const etk::String& _plop) { APPL_DEBUG("FPS = " << _plop); propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-fps", "value", "FPS=" + _plop + ""); } void appl::widget::Player::onCallbackFPS(const int32_t& _fps) { APPL_DEBUG("FPS = " << _fps); propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-label-fps", "value", "FPS=" + etk::toString(_fps) + ""); } void appl::widget::Player::stop() { propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-bt-play", "value", "false"); if (m_display == null) { return; } m_display->stop(); } void appl::widget::Player::suspend() { propertySetOnWidgetNamed("[" + etk::toString(getId()) + "]appl-player-bt-play", "value", "false"); if (m_display == null) { return; } m_display->pause(); } void appl::widget::Player::onCallbackButtonPrevious() { signalPrevious.emit(); } void appl::widget::Player::onCallbackButtonPlay(const bool& _value) { if (m_display == null) { return; } if (_value == true) { m_display->play(); } else { m_display->pause(); } } void appl::widget::Player::onCallbackButtonNext() { signalNext.emit(); }