From 02dcf6e0d7c6e870eed37772965db3738354409a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sun, 17 Oct 2010 12:17:26 +0000 Subject: [PATCH] Volume slider in monitors svn path=/trunk/kdenlive/; revision=5014 --- src/monitor.cpp | 73 ++++++++++++++++++++++++++++++++++++---------- src/monitor.h | 22 ++++++++++---- src/renderer.cpp | 25 +++++++++------- src/renderer.h | 3 +- src/smallruler.cpp | 2 +- 5 files changed, 91 insertions(+), 34 deletions(-) diff --git a/src/monitor.cpp b/src/monitor.cpp index 290ab3f9..696e03e2 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -81,23 +81,23 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget // Monitor ruler layout->addWidget(m_ruler); // Tool bar buttons - QToolBar *toolbar = new QToolBar(name, this); - toolbar->setIconSize(QSize(s, s)); + m_toolbar = new QToolBar(name, this); + m_toolbar->setIconSize(QSize(s, s)); m_playIcon = KIcon("media-playback-start"); m_pauseIcon = KIcon("media-playback-pause"); if (name != "chapter") { - toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart())); - toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd())); + m_toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart())); + m_toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd())); } else { m_ruler->setZone(-3, -2); } - toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind())); - //toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame())); + m_toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind())); + //m_toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame())); - QToolButton *playButton = new QToolButton(toolbar); + QToolButton *playButton = new QToolButton(m_toolbar); m_playMenu = new QMenu(i18n("Play..."), this); m_playAction = m_playMenu->addAction(m_playIcon, i18n("Play")); //m_playAction->setCheckable(true); @@ -105,20 +105,20 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget playButton->setMenu(m_playMenu); playButton->setPopupMode(QToolButton::MenuButtonPopup); - toolbar->addWidget(playButton); + m_toolbar->addWidget(playButton); - //toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame())); - toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward())); + //m_toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame())); + m_toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward())); playButton->setDefaultAction(m_playAction); if (name != "chapter") { - QToolButton *configButton = new QToolButton(toolbar); + QToolButton *configButton = new QToolButton(m_toolbar); m_configMenu = new QMenu(i18n("Misc..."), this); configButton->setIcon(KIcon("system-run")); configButton->setMenu(m_configMenu); configButton->setPopupMode(QToolButton::QToolButton::InstantPopup); - toolbar->addWidget(configButton); + m_toolbar->addWidget(configButton); if (name == "clip") { m_markerMenu = new QMenu(i18n("Go to marker..."), this); @@ -130,14 +130,32 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (50%)"), this, SLOT(slotSetSizeOneToTwo())); } + // Create Volume slider popup + m_volumePopup = new QFrame(this, Qt::Popup); + QVBoxLayout *poplayout = new QVBoxLayout; + poplayout->setContentsMargins(0, 0, 0, 0); + m_audioSlider = new QSlider(Qt::Vertical); + m_audioSlider->setRange(0, 100); + poplayout->addWidget(m_audioSlider); + m_volumePopup->setLayout(poplayout); + KIcon icon; + if (KdenliveSettings::volume() == 0) icon = KIcon("audio-volume-muted"); + else icon = KIcon("audio-volume-medium"); + + m_volumeWidget = m_toolbar->widgetForAction(m_toolbar->addAction(icon, i18n("Audio volume"), this, SLOT(slotShowVolume()))); + + // we need to show / hide the popup once so that it's geometry can be calculated in slotShowVolume + m_volumePopup->show(); + m_volumePopup->hide(); + QWidget *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - toolbar->addWidget(spacer); + m_toolbar->addWidget(spacer); m_timePos = new TimecodeDisplay(m_monitorManager->timecode(), this); - toolbar->addWidget(m_timePos); + m_toolbar->addWidget(m_timePos); connect(m_timePos, SIGNAL(editingFinished()), this, SLOT(slotSeek())); - toolbar->setMaximumHeight(s * 1.5); - layout->addWidget(toolbar); + m_toolbar->setMaximumHeight(s * 1.5); + layout->addWidget(m_toolbar); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setLayout(layout); @@ -165,6 +183,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget m_monitorRefresh->setRenderer(render); } + connect(m_audioSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetVolume(int))); connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int))); connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int))); connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int))); @@ -954,6 +973,28 @@ bool Monitor::effectSceneDisplayed() return m_effectView->isVisible(); } +void Monitor::slotSetVolume(int volume) +{ + KdenliveSettings::setVolume(volume); + KIcon icon; + if (volume == 0) icon = KIcon("audio-volume-muted"); + else icon = KIcon("audio-volume-medium"); + static_cast (m_volumeWidget)->setIcon(icon); + render->slotSetVolume(volume); +} + +void Monitor::slotShowVolume() +{ + m_volumePopup->move(mapToGlobal(m_toolbar->geometry().topLeft()) + QPoint(mapToParent(m_volumeWidget->geometry().bottomLeft()).x(), -m_volumePopup->height())); + int vol = render->volume(); + // Disable widget if we cannot get the volume + m_volumePopup->setEnabled(vol != -1); + m_audioSlider->blockSignals(true); + m_audioSlider->setValue(vol); + m_audioSlider->blockSignals(false); + m_volumePopup->show(); +} + MonitorRefresh::MonitorRefresh(QWidget* parent) : QWidget(parent) , m_renderer(NULL) diff --git a/src/monitor.h b/src/monitor.h index c7f6468c..70fce38a 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -20,12 +20,6 @@ #ifndef MONITOR_H #define MONITOR_H -#include - -#include -#include -#include -#include #include "gentime.h" #include "timecodedisplay.h" @@ -33,6 +27,16 @@ #include "videoglwidget.h" #endif +#include +#include +#include +#include + +#include +#include +#include + + class MonitorManager; class Render; class SmallRuler; @@ -118,6 +122,7 @@ public: void updateMarkers(DocClipBase *source); MonitorScene *getEffectScene(); QWidget *container(); + QFrame *m_volumePopup; protected: virtual void mousePressEvent(QMouseEvent * event); @@ -174,6 +179,9 @@ private: GenTime getSnapForPos(bool previous); Qt::WindowFlags m_baseFlags; + QToolBar *m_toolbar; + QWidget *m_volumeWidget; + QSlider *m_audioSlider; private slots: void seekCursor(int pos); @@ -188,6 +196,8 @@ private slots: void slotSwitchMonitorInfo(bool show); void slotSwitchDropFrames(bool show); void slotGoToMarker(QAction *action); + void slotSetVolume(int volume); + void slotShowVolume(); public slots: void slotOpenFile(const QString &); diff --git a/src/renderer.cpp b/src/renderer.cpp index 29554fed..a47b3cda 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -228,9 +228,6 @@ void Render::buildConsumer(const QString profileName) if (!audioDriver.isEmpty()) m_mltConsumer->set("audio_driver", audioDriver.toUtf8().constData()); - int volume = KdenliveSettings::volume(); - m_mltConsumer->set("volume", (float)volume / 100); - m_mltConsumer->set("progressive", 1); m_mltConsumer->set("audio_buffer", 1024); m_mltConsumer->set("frequency", 48000); @@ -256,9 +253,7 @@ int Render::resetProfile(const QString profileName) if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel"; QString background = KdenliveSettings::window_background().name(); QString currentBackground = m_mltConsumer->get("window_background"); - int volume = KdenliveSettings::volume(); - int currentVolume = (int)(QString(m_mltConsumer->get("volume")).toDouble() * 100.0); - if (m_activeProfile == profileName && currentDriver == videoDriver && volume == currentVolume && background == currentBackground) { + if (m_activeProfile == profileName && currentDriver == videoDriver && background == currentBackground) { kDebug() << "reset to same profile, nothing to do"; return 1; } @@ -813,7 +808,6 @@ int Render::setProducer(Mlt::Producer *producer, int position) } else return -1; m_mltConsumer->purge(); - m_isBlocked = true; if (m_mltProducer) { m_mltProducer->set_speed(0); @@ -824,6 +818,7 @@ int Render::setProducer(Mlt::Producer *producer, int position) if (producer) { m_mltProducer = new Mlt::Producer(producer->get_producer()); } else m_mltProducer = m_blackClip->cut(0, 50); + /*if (KdenliveSettings::dropbframes()) { m_mltProducer->set("skip_loop_filter", "all"); m_mltProducer->set("skip_frame", "bidir"); @@ -832,7 +827,8 @@ int Render::setProducer(Mlt::Producer *producer, int position) kDebug() << " WARNING - - - - -INVALID PLAYLIST: "; return -1; } - + int volume = KdenliveSettings::volume(); + m_mltProducer->set("meta.volume", (double)volume / 100); m_fps = m_mltProducer->get_fps(); int error = connectPlaylist(); @@ -919,7 +915,8 @@ int Render::setSceneList(QString playlist, int position) m_mltProducer = m_blackClip->cut(0, 50); error = -1; } - + int volume = KdenliveSettings::volume(); + m_mltProducer->set("meta.volume", (double)volume / 100); m_mltProducer->optimise(); /*if (KdenliveSettings::osdtimecode()) { @@ -1074,9 +1071,17 @@ void Render::refreshDisplay() refresh(); } -void Render::setVolume(double /*volume*/) +int Render::volume() const +{ + if (!m_mltConsumer || !m_mltProducer) return -1; + return ((int) 100 * m_mltProducer->get_double("meta.volume")); +} + +void Render::slotSetVolume(int volume) { if (!m_mltConsumer || !m_mltProducer) return; + m_mltProducer->set("meta.volume", (double)volume / 100.0); + return; /*osdTimer->stop(); m_mltConsumer->set("refresh", 0); // Attach filter for on screen display of timecode diff --git a/src/renderer.h b/src/renderer.h index 303b0fd1..0749ad13 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -127,7 +127,7 @@ Q_OBJECT public: /** @brief Stops playing. * @param startTime time to seek to */ void stop(const GenTime & startTime); - void setVolume(double volume); + int volume() const; QImage extractFrame(int frame_position, int width = -1, int height = -1); @@ -373,6 +373,7 @@ public slots: void mltSavePlaylist(); void slotSplitView(bool doit); void slotSwitchFullscreen(); + void slotSetVolume(int volume); }; #endif diff --git a/src/smallruler.cpp b/src/smallruler.cpp index 028f3849..4011bf3c 100644 --- a/src/smallruler.cpp +++ b/src/smallruler.cpp @@ -38,7 +38,7 @@ SmallRuler::SmallRuler(MonitorManager *manager, QWidget *parent) : m_zoneEnd = 60; m_zoneColor = KStatefulBrush(KColorScheme::View, KColorScheme::PositiveBackground, KSharedConfig::openConfig(KdenliveSettings::colortheme())).brush(this).color(); setMouseTracking(true); - setMinimumHeight(15); + setMinimumHeight(10); } void SmallRuler::adjustScale(int maximum) -- 2.39.2