| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 | 
							- #include "window-basic-main.hpp"
 
- #include "media-controls.hpp"
 
- #include "obs-app.hpp"
 
- #include <QToolTip>
 
- #include <QStyle>
 
- #include <QMenu>
 
- #include "ui_media-controls.h"
 
- void MediaControls::OBSMediaStopped(void *data, calldata_t *)
 
- {
 
- 	MediaControls *media = static_cast<MediaControls *>(data);
 
- 	QMetaObject::invokeMethod(media, "SetRestartState");
 
- }
 
- void MediaControls::OBSMediaPlay(void *data, calldata_t *)
 
- {
 
- 	MediaControls *media = static_cast<MediaControls *>(data);
 
- 	QMetaObject::invokeMethod(media, "SetPlayingState");
 
- }
 
- void MediaControls::OBSMediaPause(void *data, calldata_t *)
 
- {
 
- 	MediaControls *media = static_cast<MediaControls *>(data);
 
- 	QMetaObject::invokeMethod(media, "SetPausedState");
 
- }
 
- void MediaControls::OBSMediaStarted(void *data, calldata_t *)
 
- {
 
- 	MediaControls *media = static_cast<MediaControls *>(data);
 
- 	QMetaObject::invokeMethod(media, "SetPlayingState");
 
- }
 
- MediaControls::MediaControls(QWidget *parent)
 
- 	: QWidget(parent), ui(new Ui::MediaControls)
 
- {
 
- 	ui->setupUi(this);
 
- 	ui->playPauseButton->setProperty("themeID", "playIcon");
 
- 	ui->previousButton->setProperty("themeID", "previousIcon");
 
- 	ui->nextButton->setProperty("themeID", "nextIcon");
 
- 	ui->stopButton->setProperty("themeID", "stopIcon");
 
- 	setFocusPolicy(Qt::StrongFocus);
 
- 	connect(&mediaTimer, SIGNAL(timeout()), this,
 
- 		SLOT(SetSliderPosition()));
 
- 	connect(&seekTimer, SIGNAL(timeout()), this, SLOT(SeekTimerCallback()));
 
- 	connect(ui->slider, SIGNAL(sliderPressed()), this,
 
- 		SLOT(MediaSliderClicked()));
 
- 	connect(ui->slider, SIGNAL(mediaSliderHovered(int)), this,
 
- 		SLOT(MediaSliderHovered(int)));
 
- 	connect(ui->slider, SIGNAL(sliderReleased()), this,
 
- 		SLOT(MediaSliderReleased()));
 
- 	connect(ui->slider, SIGNAL(sliderMoved(int)), this,
 
- 		SLOT(MediaSliderMoved(int)));
 
- 	countDownTimer = config_get_bool(App()->GlobalConfig(), "BasicWindow",
 
- 					 "MediaControlsCountdownTimer");
 
- 	QAction *restartAction = new QAction(this);
 
- 	restartAction->setShortcut({Qt::Key_R});
 
- 	connect(restartAction, SIGNAL(triggered()), this, SLOT(RestartMedia()));
 
- 	addAction(restartAction);
 
- 	QAction *sliderFoward = new QAction(this);
 
- 	sliderFoward->setShortcutContext(Qt::WidgetWithChildrenShortcut);
 
- 	connect(sliderFoward, SIGNAL(triggered()), this,
 
- 		SLOT(MoveSliderFoward()));
 
- 	sliderFoward->setShortcut({Qt::Key_Right});
 
- 	addAction(sliderFoward);
 
- 	QAction *sliderBack = new QAction(this);
 
- 	sliderBack->setShortcutContext(Qt::WidgetWithChildrenShortcut);
 
- 	connect(sliderBack, SIGNAL(triggered()), this,
 
- 		SLOT(MoveSliderBackwards()));
 
- 	sliderBack->setShortcut({Qt::Key_Left});
 
- 	addAction(sliderBack);
 
- }
 
- MediaControls::~MediaControls() {}
 
- bool MediaControls::MediaPaused()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return false;
 
- 	}
 
- 	obs_media_state state = obs_source_media_get_state(source);
 
- 	return state == OBS_MEDIA_STATE_PAUSED;
 
- }
 
- int64_t MediaControls::GetSliderTime(int val)
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return 0;
 
- 	}
 
- 	float percent = (float)val / (float)ui->slider->maximum();
 
- 	float duration = (float)obs_source_media_get_duration(source);
 
- 	int64_t seekTo = (int64_t)(percent * duration);
 
- 	return seekTo;
 
- }
 
- void MediaControls::MediaSliderClicked()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return;
 
- 	}
 
- 	obs_media_state state = obs_source_media_get_state(source);
 
- 	if (state == OBS_MEDIA_STATE_PAUSED) {
 
- 		prevPaused = true;
 
- 	} else if (state == OBS_MEDIA_STATE_PLAYING) {
 
- 		prevPaused = false;
 
- 		PauseMedia();
 
- 		StopMediaTimer();
 
- 	}
 
- 	seek = ui->slider->value();
 
- 	seekTimer.start(100);
 
- }
 
- void MediaControls::MediaSliderReleased()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return;
 
- 	}
 
- 	if (seekTimer.isActive()) {
 
- 		seekTimer.stop();
 
- 		if (lastSeek != seek) {
 
- 			obs_source_media_set_time(source, GetSliderTime(seek));
 
- 		}
 
- 		seek = lastSeek = -1;
 
- 	}
 
- 	if (!prevPaused) {
 
- 		PlayMedia();
 
- 		StartMediaTimer();
 
- 	}
 
- }
 
- void MediaControls::MediaSliderHovered(int val)
 
- {
 
- 	float seconds = ((float)GetSliderTime(val) / 1000.0f);
 
- 	QToolTip::showText(QCursor::pos(), FormatSeconds((int)seconds), this);
 
- }
 
- void MediaControls::MediaSliderMoved(int val)
 
- {
 
- 	if (seekTimer.isActive()) {
 
- 		seek = val;
 
- 	}
 
- }
 
- void MediaControls::SeekTimerCallback()
 
- {
 
- 	if (lastSeek != seek) {
 
- 		OBSSource source = OBSGetStrongRef(weakSource);
 
- 		if (source) {
 
- 			obs_source_media_set_time(source, GetSliderTime(seek));
 
- 		}
 
- 		lastSeek = seek;
 
- 	}
 
- }
 
- void MediaControls::StartMediaTimer()
 
- {
 
- 	if (isSlideshow)
 
- 		return;
 
- 	if (!mediaTimer.isActive())
 
- 		mediaTimer.start(1000);
 
- }
 
- void MediaControls::StopMediaTimer()
 
- {
 
- 	if (mediaTimer.isActive())
 
- 		mediaTimer.stop();
 
- }
 
- void MediaControls::SetPlayingState()
 
- {
 
- 	ui->slider->setEnabled(true);
 
- 	ui->playPauseButton->setProperty("themeID", "pauseIcon");
 
- 	ui->playPauseButton->style()->unpolish(ui->playPauseButton);
 
- 	ui->playPauseButton->style()->polish(ui->playPauseButton);
 
- 	ui->playPauseButton->setToolTip(
 
- 		QTStr("ContextBar.MediaControls.PauseMedia"));
 
- 	prevPaused = false;
 
- 	StartMediaTimer();
 
- }
 
- void MediaControls::SetPausedState()
 
- {
 
- 	ui->playPauseButton->setProperty("themeID", "playIcon");
 
- 	ui->playPauseButton->style()->unpolish(ui->playPauseButton);
 
- 	ui->playPauseButton->style()->polish(ui->playPauseButton);
 
- 	ui->playPauseButton->setToolTip(
 
- 		QTStr("ContextBar.MediaControls.PlayMedia"));
 
- 	StopMediaTimer();
 
- }
 
- void MediaControls::SetRestartState()
 
- {
 
- 	ui->playPauseButton->setProperty("themeID", "restartIcon");
 
- 	ui->playPauseButton->style()->unpolish(ui->playPauseButton);
 
- 	ui->playPauseButton->style()->polish(ui->playPauseButton);
 
- 	ui->playPauseButton->setToolTip(
 
- 		QTStr("ContextBar.MediaControls.RestartMedia"));
 
- 	ui->slider->setValue(0);
 
- 	ui->timerLabel->setText("--:--:--");
 
- 	ui->durationLabel->setText("--:--:--");
 
- 	ui->slider->setEnabled(false);
 
- 	StopMediaTimer();
 
- }
 
- void MediaControls::RefreshControls()
 
- {
 
- 	OBSSource source;
 
- 	source = OBSGetStrongRef(weakSource);
 
- 	uint32_t flags = 0;
 
- 	const char *id = nullptr;
 
- 	if (source) {
 
- 		flags = obs_source_get_output_flags(source);
 
- 		id = obs_source_get_unversioned_id(source);
 
- 	}
 
- 	if (!source || !(flags & OBS_SOURCE_CONTROLLABLE_MEDIA)) {
 
- 		SetRestartState();
 
- 		setEnabled(false);
 
- 		hide();
 
- 		return;
 
- 	} else {
 
- 		setEnabled(true);
 
- 		show();
 
- 	}
 
- 	bool has_playlist = strcmp(id, "ffmpeg_source") != 0;
 
- 	ui->previousButton->setVisible(has_playlist);
 
- 	ui->nextButton->setVisible(has_playlist);
 
- 	isSlideshow = strcmp(id, "slideshow") == 0;
 
- 	ui->slider->setVisible(!isSlideshow);
 
- 	ui->timerLabel->setVisible(!isSlideshow);
 
- 	ui->label->setVisible(!isSlideshow);
 
- 	ui->durationLabel->setVisible(!isSlideshow);
 
- 	ui->emptySpaceAgain->setVisible(isSlideshow);
 
- 	obs_media_state state = obs_source_media_get_state(source);
 
- 	switch (state) {
 
- 	case OBS_MEDIA_STATE_STOPPED:
 
- 	case OBS_MEDIA_STATE_ENDED:
 
- 	case OBS_MEDIA_STATE_NONE:
 
- 		SetRestartState();
 
- 		break;
 
- 	case OBS_MEDIA_STATE_PLAYING:
 
- 		SetPlayingState();
 
- 		break;
 
- 	case OBS_MEDIA_STATE_PAUSED:
 
- 		SetPausedState();
 
- 		break;
 
- 	default:
 
- 		break;
 
- 	}
 
- 	SetSliderPosition();
 
- }
 
- OBSSource MediaControls::GetSource()
 
- {
 
- 	return OBSGetStrongRef(weakSource);
 
- }
 
- void MediaControls::SetSource(OBSSource source)
 
- {
 
- 	sigs.clear();
 
- 	if (source) {
 
- 		weakSource = OBSGetWeakRef(source);
 
- 		signal_handler_t *sh = obs_source_get_signal_handler(source);
 
- 		sigs.emplace_back(sh, "media_play", OBSMediaPlay, this);
 
- 		sigs.emplace_back(sh, "media_pause", OBSMediaPause, this);
 
- 		sigs.emplace_back(sh, "media_restart", OBSMediaPlay, this);
 
- 		sigs.emplace_back(sh, "media_stopped", OBSMediaStopped, this);
 
- 		sigs.emplace_back(sh, "media_started", OBSMediaStarted, this);
 
- 		sigs.emplace_back(sh, "media_ended", OBSMediaStopped, this);
 
- 	} else {
 
- 		weakSource = nullptr;
 
- 	}
 
- 	RefreshControls();
 
- }
 
- void MediaControls::SetSliderPosition()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return;
 
- 	}
 
- 	float time = (float)obs_source_media_get_time(source);
 
- 	float duration = (float)obs_source_media_get_duration(source);
 
- 	float sliderPosition = (time / duration) * (float)ui->slider->maximum();
 
- 	ui->slider->setValue((int)sliderPosition);
 
- 	ui->timerLabel->setText(FormatSeconds((int)(time / 1000.0f)));
 
- 	if (!countDownTimer)
 
- 		ui->durationLabel->setText(
 
- 			FormatSeconds((int)(duration / 1000.0f)));
 
- 	else
 
- 		ui->durationLabel->setText(
 
- 			QString("-") +
 
- 			FormatSeconds((int)((duration - time) / 1000.0f)));
 
- }
 
- QString MediaControls::FormatSeconds(int totalSeconds)
 
- {
 
- 	int seconds = totalSeconds % 60;
 
- 	int totalMinutes = totalSeconds / 60;
 
- 	int minutes = totalMinutes % 60;
 
- 	int hours = totalMinutes / 60;
 
- 	return QString::asprintf("%02d:%02d:%02d", hours, minutes, seconds);
 
- }
 
- void MediaControls::on_playPauseButton_clicked()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source) {
 
- 		return;
 
- 	}
 
- 	obs_media_state state = obs_source_media_get_state(source);
 
- 	switch (state) {
 
- 	case OBS_MEDIA_STATE_STOPPED:
 
- 	case OBS_MEDIA_STATE_ENDED:
 
- 		RestartMedia();
 
- 		break;
 
- 	case OBS_MEDIA_STATE_PLAYING:
 
- 		PauseMedia();
 
- 		break;
 
- 	case OBS_MEDIA_STATE_PAUSED:
 
- 		PlayMedia();
 
- 		break;
 
- 	default:
 
- 		break;
 
- 	}
 
- }
 
- void MediaControls::RestartMedia()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_restart(source);
 
- 	}
 
- }
 
- void MediaControls::PlayMedia()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_play_pause(source, false);
 
- 	}
 
- }
 
- void MediaControls::PauseMedia()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_play_pause(source, true);
 
- 	}
 
- }
 
- void MediaControls::StopMedia()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_stop(source);
 
- 	}
 
- }
 
- void MediaControls::PlaylistNext()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_next(source);
 
- 	}
 
- }
 
- void MediaControls::PlaylistPrevious()
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (source) {
 
- 		obs_source_media_previous(source);
 
- 	}
 
- }
 
- void MediaControls::on_stopButton_clicked()
 
- {
 
- 	StopMedia();
 
- }
 
- void MediaControls::on_nextButton_clicked()
 
- {
 
- 	PlaylistNext();
 
- }
 
- void MediaControls::on_previousButton_clicked()
 
- {
 
- 	PlaylistPrevious();
 
- }
 
- void MediaControls::on_durationLabel_clicked()
 
- {
 
- 	countDownTimer = !countDownTimer;
 
- 	config_set_bool(App()->GlobalConfig(), "BasicWindow",
 
- 			"MediaControlsCountdownTimer", countDownTimer);
 
- 	if (MediaPaused())
 
- 		SetSliderPosition();
 
- }
 
- void MediaControls::MoveSliderFoward(int seconds)
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source)
 
- 		return;
 
- 	int ms = obs_source_media_get_time(source);
 
- 	ms += seconds * 1000;
 
- 	obs_source_media_set_time(source, ms);
 
- 	SetSliderPosition();
 
- }
 
- void MediaControls::MoveSliderBackwards(int seconds)
 
- {
 
- 	OBSSource source = OBSGetStrongRef(weakSource);
 
- 	if (!source)
 
- 		return;
 
- 	int ms = obs_source_media_get_time(source);
 
- 	ms -= seconds * 1000;
 
- 	obs_source_media_set_time(source, ms);
 
- 	SetSliderPosition();
 
- }
 
 
  |