diff options
Diffstat (limited to 'src/core.cpp')
-rw-r--r-- | src/core.cpp | 278 |
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; |