]> git.sesse.net Git - kdenlive/commitdiff
Volume slider in monitors
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 17 Oct 2010 12:17:26 +0000 (12:17 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 17 Oct 2010 12:17:26 +0000 (12:17 +0000)
svn path=/trunk/kdenlive/; revision=5014

src/monitor.cpp
src/monitor.h
src/renderer.cpp
src/renderer.h
src/smallruler.cpp

index 290ab3f9b980dd71d13ac1bc7e935345506c403c..696e03e2e0e1c0ff7d289921b91892910bba56fd 100644 (file)
@@ -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 <QToolButton *>(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)
index c7f6468c7c14bb9d0835cac0eb2fa3e1a4d3e3b3..70fce38ad79ff566563ce90ad9d3ff1fad753741 100644 (file)
 #ifndef MONITOR_H
 #define MONITOR_H
 
-#include <QLabel>
-
-#include <KIcon>
-#include <KAction>
-#include <KRestrictedLine>
-#include <QDomElement>
 
 #include "gentime.h"
 #include "timecodedisplay.h"
 #include "videoglwidget.h"
 #endif
 
+#include <QLabel>
+#include <QDomElement>
+#include <QToolBar>
+#include <QSlider>
+
+#include <KIcon>
+#include <KAction>
+#include <KRestrictedLine>
+
+
 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 &);
index 29554fed241ca71c2e491c9b2e0be77247220f17..a47b3cda227e31674b66e0bff7261e468ad35730 100644 (file)
@@ -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
index 303b0fd1fe8ba1cbdccd0dc38a416862867a3740..0749ad13ddae6522478a22d0d6d7d972c57d66f4 100644 (file)
@@ -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
index 028f38491d6f9366cce51e6d98eaed2b75d5b138..4011bf3c7b537deec8d1967ed77eeb8cbaacc44d 100644 (file)
@@ -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)