summaryrefslogtreecommitdiff
path: root/src/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.cpp')
-rw-r--r--src/core.cpp278
1 files changed, 200 insertions, 78 deletions
diff --git a/src/core.cpp b/src/core.cpp
index c00d220..caafc34 100644
--- a/src/core.cpp
+++ b/src/core.cpp
@@ -1,5 +1,5 @@
/* smplayer, GUI front-end for mplayer.
- Copyright (C) 2006-2009 Ricardo Villalba <rvm@escomposlinux.org>
+ Copyright (C) 2006-2010 Ricardo Villalba <rvm@escomposlinux.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -133,6 +133,9 @@ Core::Core( MplayerWindow *mpw, QWidget* parent )
connect( proc, SIGNAL(receivedUpdatingFontCache()),
this, SLOT(displayUpdatingFontCache()) );
+ connect( proc, SIGNAL(receivedScanningFont(QString)),
+ this, SLOT(displayMessage(QString)) );
+
connect( proc, SIGNAL(receivedWindowResolution(int,int)),
this, SLOT(gotWindowResolution(int,int)) );
@@ -151,6 +154,9 @@ Core::Core( MplayerWindow *mpw, QWidget* parent )
connect( proc, SIGNAL(receivedStartingTime(double)),
this, SLOT(gotStartingTime(double)) );
+ connect( proc, SIGNAL(receivedStreamTitle(QString)),
+ this, SLOT(streamTitleChanged(QString)) );
+
connect( proc, SIGNAL(receivedStreamTitleAndUrl(QString,QString)),
this, SLOT(streamTitleAndUrlChanged(QString,QString)) );
@@ -340,6 +346,17 @@ void Core::tellmp(const QString & command) {
}
}
+void Core::displayTextOnOSD(QString text, int duration, int level, QString prefix) {
+ qDebug("Core::displayTextOnOSD: '%s'", text.toUtf8().constData());
+
+ if (proc->isRunning()) {
+ QString str = QString("osd_show_text \"%1\" %2 %3\n").arg(text.toUtf8().constData()).arg(duration).arg(level);
+ if (!prefix.isEmpty()) str = prefix + " " + str;
+ qDebug("Core::displayTextOnOSD: command: '%s'", str.toUtf8().constData());
+ proc->write(str.toAscii());
+ }
+}
+
// Generic open, autodetect type
void Core::open(QString file, int seek) {
qDebug("Core::open: '%s'", file.toUtf8().data());
@@ -454,7 +471,7 @@ void Core::loadSub(const QString & sub ) {
just_loaded_external_subs = true;
QFileInfo fi(sub);
- if (fi.suffix().toLower() != "idx") {
+ if ((pref->fast_load_sub) && (fi.suffix().toLower() != "idx")) {
QString sub_file = sub;
#ifdef Q_OS_WIN
if (pref->use_short_pathnames) {
@@ -1023,13 +1040,16 @@ void Core::finishRestart() {
emit videoEqualizerNeedsUpdate();
emit audioEqualizerNeedsUpdate();
- changePanscan(mset.panscan_factor);
+ changeZoom(mset.zoom_factor);
// Toggle subtitle visibility
changeSubVisibility(pref->sub_visibility);
+ // A-B marker
+ emit ABMarkersChanged(mset.A_marker, mset.B_marker);
+
// Initialize the OSD level
- QTimer::singleShot(3000, this, SLOT(initializeOSD()));
+ QTimer::singleShot(pref->osd_delay, this, SLOT(initializeOSD()));
emit mediaLoaded();
emit mediaInfoChanged();
@@ -1141,9 +1161,7 @@ void Core::screenshot() {
qDebug("Core::screenshot: taken screenshot");
} else {
qDebug("Core::screenshot: error: directory for screenshots not valid");
- QString text = "Screenshot NOT taken, folder not configured";
- tellmp("osd_show_text \"" + text + "\" 3000 1");
- emit showMessage(text);
+ emit showMessage( tr("Screenshot NOT taken, folder not configured") );
}
}
@@ -1156,9 +1174,7 @@ void Core::screenshots() {
tellmp( "screenshot 1");
} else {
qDebug("Core::screenshots: error: directory for screenshots not valid");
- QString text = "Screenshots NOT taken, folder not configured";
- tellmp("osd_show_text \"" + text + "\" 3000 1");
- emit showMessage(text);
+ emit showMessage( tr("Screenshots NOT taken, folder not configured") );
}
}
@@ -1211,10 +1227,21 @@ void Core::fileReachedEnd() {
#if SEEKBAR_RESOLUTION
void Core::goToPosition(int value) {
qDebug("Core::goToPosition: value: %d", value);
- if (mdat.duration > 0) {
- int jump_time = (int) mdat.duration * value / SEEKBAR_RESOLUTION;
- goToSec(jump_time);
+
+ if (pref->relative_seeking) {
+ goToPos( (double) value / (SEEKBAR_RESOLUTION / 100) );
}
+ else {
+ if (mdat.duration > 0) {
+ int jump_time = (int) mdat.duration * value / SEEKBAR_RESOLUTION;
+ goToSec(jump_time);
+ }
+ }
+}
+
+void Core::goToPos(double perc) {
+ qDebug("Core::goToPos: per: %f", perc);
+ tellmp( "seek " + QString::number(perc) + " 1");
}
#else
void Core::goToPos(int perc) {
@@ -1297,7 +1324,12 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument("-fs");
} else {
// No mplayer fullscreen mode
+#if !USE_MPLAYER_PANSCAN
proc->addArgument("-nofs");
+#else
+ // The command 'panscan' requires -fs
+ proc->addArgument("-fs");
+#endif
}
proc->addArgument("-nomouseinput");
@@ -1418,12 +1450,6 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument( "-ao");
proc->addArgument( pref->ao );
}
-#ifndef Q_OS_WIN
- else {
- proc->addArgument( "-ao");
- proc->addArgument( "alsa," );
- }
-#endif
#ifndef Q_OS_WIN
if (pref->vo.startsWith("x11")) {
@@ -1827,8 +1853,16 @@ void Core::startMplayer( QString file, double seek ) {
}
if (mdat.type != TYPE_TV) {
+ // Play A - B
+ if ((mset.A_marker > -1) && (mset.B_marker > mset.A_marker)) {
+ proc->addArgument("-ss");
+ proc->addArgument( QString::number( mset.A_marker ) );
+ proc->addArgument("-endpos");
+ proc->addArgument( QString::number( mset.B_marker - mset.A_marker ) );
+ }
+ else
// If seek < 5 it's better to allow the video to start from the beginning
- if ((seek >= 5) && (!pref->loop)) {
+ if ((seek >= 5) && (!mset.loop)) {
proc->addArgument("-ss");
proc->addArgument( QString::number( seek ) );
}
@@ -1837,7 +1871,7 @@ void Core::startMplayer( QString file, double seek ) {
// Enable the OSD later, to avoid a lot of messages to be
// printed on startup
proc->addArgument("-osdlevel");
- proc->addArgument( 0 );
+ proc->addArgument( "0" );
if (pref->use_idx) {
proc->addArgument("-idx");
@@ -1867,6 +1901,15 @@ void Core::startMplayer( QString file, double seek ) {
}
}
+ bool force_noslices = false;
+
+#ifndef Q_OS_WIN
+ if ((pref->disable_video_filters_with_vdpau) && (pref->vo.startsWith("vdpau"))) {
+ qDebug("Core::startMplayer: vdpau doesn't allow any video filter. All have been removed.");
+ goto end_video_filters;
+ }
+#endif
+
// Video filters:
// Phase
if (mset.phase_filter) {
@@ -1967,8 +2010,6 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument( pref->mplayer_additional_video_filters );
}
- bool force_noslices = false;
-
// Filters for subtitles on screenshots
if ((screenshot_enabled) && (pref->subtitles_on_screenshots))
{
@@ -2009,15 +2050,7 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument("screenshot");
}
-
- // VDPAU doesn't allow any video filters!
-#ifndef Q_OS_WIN
- if (pref->vo.startsWith("vdpau")) {
- proc->addArgument("-vf-clr");
- qDebug("Core::startMplayer: vdpau doesn't allow any video filter. All have been removed.");
- }
-#endif
-
+end_video_filters:
// slices
if ((pref->use_slices) && (!force_noslices)) {
@@ -2033,18 +2066,20 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument( QString::number( mset.audio_use_channels ) );
}
- // Stereo mode
- if (mset.stereo_mode != 0) {
- proc->addArgument("-stereo");
- proc->addArgument( QString::number( mset.stereo_mode ) );
- }
-
// Audio filters
QString af="";
if (mset.karaoke_filter) {
af="karaoke";
}
+ // Stereo mode
+ if (mset.stereo_mode != 0) {
+ if (mset.stereo_mode == MediaSettings::Left)
+ af += "channels=2:2:0:1:0:0";
+ else
+ af += "channels=2:2:1:0:1:1";
+ }
+
if (mset.extrastereo_filter) {
if (!af.isEmpty()) af += ",";
af += "extrastereo";
@@ -2084,8 +2119,13 @@ void Core::startMplayer( QString file, double seek ) {
}
if (!af.isEmpty()) {
- proc->addArgument("-af");
- proc->addArgument( af );
+ // Don't use audio filters if using the S/PDIF output
+ if (pref->use_hwac3) {
+ qDebug("Core::startMplayer: audio filters are disabled when using the S/PDIF output!");
+ } else {
+ proc->addArgument("-af");
+ proc->addArgument( af );
+ }
}
if (pref->use_soft_vol) {
@@ -2148,7 +2188,7 @@ void Core::startMplayer( QString file, double seek ) {
proc->addArgument( file );
// It seems the loop option must be after the filename
- if (pref->loop) {
+ if (mset.loop) {
proc->addArgument("-loop");
proc->addArgument("0");
}
@@ -2194,7 +2234,7 @@ void Core::goToSec( double sec ) {
if (sec < 0) sec = 0;
if (sec > mdat.duration ) sec = mdat.duration - 20;
- tellmp("pausing_keep seek " + QString::number(sec) + " 2");
+ tellmp("seek " + QString::number(sec) + " 2");
}
@@ -2253,8 +2293,8 @@ void Core::wheelUp() {
qDebug("Core::wheelUp");
switch (pref->wheel_function) {
case Preferences::Volume : incVolume(); break;
- case Preferences::Zoom : incPanscan(); break;
- case Preferences::Seeking : forward( pref->seeking4 ); break;
+ case Preferences::Zoom : incZoom(); break;
+ case Preferences::Seeking : pref->wheel_function_seeking_reverse ? rewind( pref->seeking4 ) : forward( pref->seeking4 ); break;
case Preferences::ChangeSpeed : incSpeed10(); break;
default : {} // do nothing
}
@@ -2264,27 +2304,73 @@ void Core::wheelDown() {
qDebug("Core::wheelDown");
switch (pref->wheel_function) {
case Preferences::Volume : decVolume(); break;
- case Preferences::Zoom : decPanscan(); break;
- case Preferences::Seeking : rewind( pref->seeking4 ); break;
+ case Preferences::Zoom : decZoom(); break;
+ case Preferences::Seeking : pref->wheel_function_seeking_reverse ? forward( pref->seeking4 ) : rewind( pref->seeking4 ); break;
case Preferences::ChangeSpeed : decSpeed10(); break;
default : {} // do nothing
}
}
+void Core::setAMarker() {
+ setAMarker((int)mset.current_sec);
+}
+
+void Core::setAMarker(int sec) {
+ qDebug("Core::setAMarker: %d", sec);
+
+ mset.A_marker = sec;
+ displayMessage( tr("\"A\" marker set to %1").arg(Helper::formatTime(sec)) );
+
+ if (mset.B_marker > mset.A_marker) {
+ if (proc->isRunning()) restartPlay();
+ }
+
+ emit ABMarkersChanged(mset.A_marker, mset.B_marker);
+}
+
+void Core::setBMarker() {
+ setBMarker((int)mset.current_sec);
+}
+
+void Core::setBMarker(int sec) {
+ qDebug("Core::setBMarker: %d", sec);
+
+ mset.B_marker = sec;
+ displayMessage( tr("\"B\" marker set to %1").arg(Helper::formatTime(sec)) );
+
+ if ((mset.A_marker > -1) && (mset.A_marker < mset.B_marker)) {
+ if (proc->isRunning()) restartPlay();
+ }
+
+ emit ABMarkersChanged(mset.A_marker, mset.B_marker);
+}
+
+void Core::clearABMarkers() {
+ qDebug("Core::clearABMarkers");
+
+ if ((mset.A_marker != -1) || (mset.B_marker != -1)) {
+ mset.A_marker = -1;
+ mset.B_marker = -1;
+ displayMessage( tr("A-B markers cleared") );
+ if (proc->isRunning()) restartPlay();
+ }
+
+ emit ABMarkersChanged(mset.A_marker, mset.B_marker);
+}
void Core::toggleRepeat() {
qDebug("Core::toggleRepeat");
- toggleRepeat( !pref->loop );
+ toggleRepeat( !mset.loop );
}
void Core::toggleRepeat(bool b) {
qDebug("Core::toggleRepeat: %d", b);
- if ( pref->loop != b ) {
- pref->loop = b;
+ if ( mset.loop != b ) {
+ mset.loop = b;
if (MplayerVersion::isMplayerAtLeast(23747)) {
// Use slave command
int v = -1; // no loop
- if (pref->loop) v = 0; // infinite loop
+ if (mset.loop) v = 0; // infinite loop
tellmp( QString("loop %1 1").arg(v) );
} else {
// Restart mplayer
@@ -3452,20 +3538,20 @@ void Core::toggleDoubleSize() {
changeSize(200);
}
-void Core::changePanscan(double p) {
- qDebug("Core::changePanscan: %f", p);
+void Core::changeZoom(double p) {
+ qDebug("Core::changeZoom: %f", p);
if (p < ZOOM_MIN) p = ZOOM_MIN;
- mset.panscan_factor = p;
+ mset.zoom_factor = p;
mplayerwindow->setZoom(p);
- displayMessage( tr("Zoom: %1").arg(mset.panscan_factor) );
+ displayMessage( tr("Zoom: %1").arg(mset.zoom_factor) );
}
-void Core::resetPanscan() {
- changePanscan(1.0);
+void Core::resetZoom() {
+ changeZoom(1.0);
}
-void Core::autoPanscan() {
+void Core::autoZoom() {
double video_aspect = mset.aspectToNum( (MediaSettings::Aspect) mset.aspect_ratio_id);
if (video_aspect <= 0) {
@@ -3481,15 +3567,15 @@ void Core::autoPanscan() {
else
zoom_factor = screen_aspect / video_aspect;
- qDebug("Core::autoPanscan: video_aspect: %f", video_aspect);
- qDebug("Core::autoPanscan: screen_aspect: %f", screen_aspect);
- qDebug("Core::autoPanscan: zoom_factor: %f", zoom_factor);
+ qDebug("Core::autoZoom: video_aspect: %f", video_aspect);
+ qDebug("Core::autoZoom: screen_aspect: %f", screen_aspect);
+ qDebug("Core::autoZoom: zoom_factor: %f", zoom_factor);
- changePanscan(zoom_factor);
+ changeZoom(zoom_factor);
}
-void Core::autoPanscanFromLetterbox(double aspect) {
- qDebug("Core::autoPanscanFromLetterbox: %f", aspect);
+void Core::autoZoomFromLetterbox(double aspect) {
+ qDebug("Core::autoZoomFromLetterbox: %f", aspect);
// Probably there's a much easy way to do this, but I'm not good with maths...
@@ -3511,37 +3597,68 @@ void Core::autoPanscanFromLetterbox(double aspect) {
video.setHeight( (int) (video.width() / video_aspect) );
}
- qDebug("Core::autoPanscanFromLetterbox: max. size of video: %d %d", video.width(), video.height());
+ qDebug("Core::autoZoomFromLetterbox: max. size of video: %d %d", video.width(), video.height());
// Calculate the size of the actual video inside the letterbox
QSize actual_video;
actual_video.setWidth( video.width() );
actual_video.setHeight( (int) (actual_video.width() / aspect) );
- qDebug("Core::autoPanscanFromLetterbox: calculated size of actual video for aspect %f: %d %d", aspect, actual_video.width(), actual_video.height());
+ qDebug("Core::autoZoomFromLetterbox: calculated size of actual video for aspect %f: %d %d", aspect, actual_video.width(), actual_video.height());
double zoom_factor = (double) desktop.height() / actual_video.height();
- qDebug("Core::autoPanscanFromLetterbox: calculated zoom factor: %f", zoom_factor);
- changePanscan(zoom_factor);
+ qDebug("Core::autoZoomFromLetterbox: calculated zoom factor: %f", zoom_factor);
+ changeZoom(zoom_factor);
+}
+
+void Core::autoZoomFor169() {
+ autoZoomFromLetterbox((double) 16 / 9);
}
-void Core::autoPanscanFor169() {
- autoPanscanFromLetterbox((double) 16 / 9);
+void Core::autoZoomFor235() {
+ autoZoomFromLetterbox(2.35);
}
-void Core::autoPanscanFor235() {
- autoPanscanFromLetterbox(2.35);
+void Core::incZoom() {
+ qDebug("Core::incZoom");
+ changeZoom( mset.zoom_factor + ZOOM_STEP );
+}
+
+void Core::decZoom() {
+ qDebug("Core::decZoom");
+ changeZoom( mset.zoom_factor - ZOOM_STEP );
+}
+
+#if USE_MPLAYER_PANSCAN
+void Core::changePanscan(double p) {
+ qDebug("Core::changePanscan: %f", p);
+
+ if (p < 0.1) p = 0;
+ if (p > 1) p = 1;
+
+ mset.panscan_factor = p;
+ tellmp(QString("panscan %1 1").arg(mset.panscan_factor));
+ displayMessage( QString("Panscan: %1").arg(mset.panscan_factor) );
}
void Core::incPanscan() {
- qDebug("Core::incPanscan");
- changePanscan( mset.panscan_factor + ZOOM_STEP );
+ changePanscan(mset.panscan_factor + .1);
}
void Core::decPanscan() {
- qDebug("Core::decPanscan");
- changePanscan( mset.panscan_factor - ZOOM_STEP );
+ changePanscan(mset.panscan_factor - .1);
+}
+#endif
+
+void Core::showFilenameOnOSD() {
+ tellmp("osd_show_property_text \"${filename}\" 3000 0");
+}
+
+void Core::toggleDeinterlace() {
+ qDebug("Core::toggleDeinterlace");
+
+ tellmp("step_property deinterlace");
}
void Core::changeUseAss(bool b) {
@@ -3636,7 +3753,7 @@ void Core::displayMessage(QString text) {
emit showMessage(text);
if ((pref->fullscreen) && (state() != Paused)) {
- tellmp("osd_show_text \"" + text + "\" 3000 1");
+ displayTextOnOSD( text );
}
}
@@ -3646,13 +3763,13 @@ void Core::displayScreenshotName(QString filename) {
QString text = QString("Screenshot saved as %1").arg(filename);
if (MplayerVersion::isMplayerAtLeast(27665)) {
- tellmp( "pausing_keep_force osd_show_text \"" + text + "\" 3000 1");
+ displayTextOnOSD(text, 3000, 1, "pausing_keep_force");
}
else
if (state() != Paused) {
// Dont' show the message on OSD while in pause, otherwise
// the video goes forward a frame.
- tellmp("pausing_keep osd_show_text \"" + text + "\" 3000 1");
+ displayTextOnOSD(text, 3000, 1, "pausing_keep");
}
emit showMessage(text);
@@ -3719,6 +3836,11 @@ void Core::gotAO(QString ao) {
}
}
+void Core::streamTitleChanged(QString title) {
+ mdat.stream_title = title;
+ emit mediaInfoChanged();
+}
+
void Core::streamTitleAndUrlChanged(QString title, QString url) {
mdat.stream_title = title;
mdat.stream_url = url;