]> git.sesse.net Git - kdenlive/commitdiff
* Play audio when previewing in v4l capture mode
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 21 Dec 2011 15:27:17 +0000 (16:27 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 21 Dec 2011 15:27:17 +0000 (16:27 +0100)
* Connect to audio levels so that we can preview the volume
* Add Pulseaudio capture to v4l

icons/CMakeLists.txt
src/abstractmonitor.h
src/audiosignal.cpp
src/kdenlivesettingsdialog.cpp
src/mainwindow.cpp
src/mltdevicecapture.cpp
src/mltdevicecapture.h
src/recmonitor.cpp
src/recmonitor.h

index 6ab32fbdd5dd4f8fabadeccb8c77ae2c5f17002e..c41644a6a9fc09970c4812ff8876b9176d87a32e 100644 (file)
@@ -1,3 +1,3 @@
 #FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.svg*")
-kde4_install_icons( ${DATA_INSTALL_DIR}/kdenlive/icons)
+kde4_install_icons( ${DATA_INSTALL_DIR}/kdenlive/icons )
 #install( FILES ${files} DESTINATION ${ICON_INSTALL_DIR} )
index 1167e6c446f8bc09b677158f193ee1fc2df7e9d8..c58ae0e0bb104554815734f062c9542d357daf59 100644 (file)
@@ -95,7 +95,7 @@ signals:
     void frameUpdated(QImage);
 
     /** @brief This signal contains the audio of the current frame. */
-    void audioSamplesSignal(QVector<int16_t>, int, int, int);
+    void audioSamplesSignal(const QVector<int16_t>&, const int&, const int&, const int&);
 };
 
 class AbstractMonitor : public QWidget
index 00c5946541c70f71cd954e46087e76acb7a9cc46..3582148cbe7c8efbc6bcb3d967ccad5fbd82ba74 100644 (file)
@@ -57,7 +57,8 @@ bool AudioSignal::monitoringEnabled() const
     return m_aMonitoringEnabled->isChecked();
 }
 
-void AudioSignal::slotReceiveAudio(const QVector<int16_t>& data, int, int num_channels, int samples){
+void AudioSignal::slotReceiveAudio(const QVector<int16_t>& data, int, int num_channels, int samples)
+{
 
     int num_samples = samples > 200 ? 200 : samples;
 
index ff953b5bd3748feeb2fe5a93f6278f9239ad412e..ca975e37aa6f7cc47001b5c44ef4aca7c256873f 100644 (file)
@@ -400,6 +400,10 @@ void KdenliveSettingsDialog::initDevices()
             file.close();
         }
     }
+    
+    // Add pulseaudio capture option
+    m_configCapture.kcfg_v4l_alsadevice->addItem(i18n("PulseAudio"), "pulse");
+    
     if (!KdenliveSettings::audiodevicename().isEmpty()) {
         // Select correct alsa device
         int ix = m_configSdl.kcfg_audio_device->findData(KdenliveSettings::audiodevicename());
index 6aedb516c0e7609a9109433a8ae498d433b76da0..498f4a695136333c1918cf9dc64cdcc9a637998d 100644 (file)
@@ -247,6 +247,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
     connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
     connect(m_recMonitor, SIGNAL(addProjectClipList(KUrl::List)), this, SLOT(slotAddProjectClipList(KUrl::List)));
     connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int)));
+    
 #endif /* ! Q_WS_MAC */
     m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor);
 
@@ -4377,7 +4378,6 @@ void MainWindow::slotDoUpdateAudioScopeFrameRequest()
 void MainWindow::slotUpdateColorScopes()
 {
     bool request = false;
-    kDebug()<<"// UPDATE SCOPES";
     for (int i = 0; i < m_gfxScopesList.count(); i++) {
         // Check if we need the renderer to send a new frame for update
         if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true;
@@ -4386,6 +4386,9 @@ void MainWindow::slotUpdateColorScopes()
     if (request && m_monitorManager->activeRenderer()) {
         m_monitorManager->activeRenderer()->sendFrameUpdate();
     }
+    if (m_audiosignal->isVisible() && m_recMonitor->abstractRender()) {
+        connect(m_recMonitor->abstractRender(), SIGNAL(audioSamplesSignal(const QVector<int16_t>&, const int&, const int&, const int&)), m_audiosignal, SLOT(slotReceiveAudio(const QVector<int16_t>&, const int&, const int&, const int&)));
+    }
 }
 
 void MainWindow::slotClearColorScopes()
index c92b18c29dd67a3153c69bbf1aaf4556b1a217cd..d58b3e056974d99b34c0743699cfe6886775f8cf 100644 (file)
@@ -71,11 +71,11 @@ static void rec_consumer_frame_preview(mlt_consumer, MltDeviceCapture * self, ml
     }
 
     //TODO: connect record monitor to audio scopes
-    /*
+    
     if (self->analyseAudio) {
         self->showAudio(frame);
     }
-    */
+    
 }
 
 
@@ -272,7 +272,6 @@ void MltDeviceCapture::showAudio(Mlt::Frame& frame)
     // So the vector is of size samples*channels.
     QVector<int16_t> sampleVector(samples*num_channels);
     memcpy(sampleVector.data(), data, samples*num_channels*sizeof(int16_t));
-
     if (samples > 0) {
         emit audioSamplesSignal(sampleVector, freq, num_channels, samples);
     }
index ba757335077180dc829706049bfcf3856c081604..e25de57de830fa60e68aec4d08594153dcd50029 100644 (file)
@@ -136,9 +136,6 @@ signals:
      *
      * Used in Mac OS X. */
     void showImageSignal(QImage);
-    
-    /** @brief This signal contains the audio of the current frame. */
-    void audioSamplesSignal(const QVector<int16_t>&, int freq, int num_channels, int num_samples);
 
     void frameSaved(const QString &);
     
index 9ec0c44257d70bde6ec5e3507112097dbadaa96d..59d4fc1feee587c1db53dd9b92a1a0a5573e3754 100644 (file)
@@ -473,8 +473,10 @@ void RecMonitor::slotStartPreview(bool play)
         m_manager->activateMonitor("record");
         buildMltDevice(path);
         profile = ProfilesDialog::getVideoProfile(path);
-        producer = QString("avformat-novalidate:video4linux2:%1?width:%2&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
-        if (!m_captureDevice->slotStartPreview(producer)) {
+        producer = getV4lXmlPlaylist(profile);
+        
+        //producer = QString("avformat-novalidate:video4linux2:%1?width:%2&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
+        if (!m_captureDevice->slotStartPreview(producer, true)) {
             // v4l capture failed to start
             video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
             m_videoBox->setHidden(true);
@@ -563,15 +565,12 @@ void RecMonitor::slotRecord()
             profile = ProfilesDialog::getVideoProfile(path);
             m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den);
             buildMltDevice(path);
-            playlist = QString("<mlt title=\"capture\"><producer id=\"producer0\" in=\"0\" out=\"99999\"><property name=\"mlt_type\">producer</property><property name=\"length\">100000</property><property name=\"eof\">pause</property><property name=\"resource\">video4linux2:%1?width:%2&amp;height:%3&amp;frame_rate:%4</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist0\"><entry producer=\"producer0\" in=\"0\" out=\"99999\"/></playlist>").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
+            playlist = getV4lXmlPlaylist(profile);
 
             v4lparameters = KdenliveSettings::v4l_parameters();
 
             // Add alsa audio capture
-            if (KdenliveSettings::v4l_captureaudio()) {
-                playlist.append(QString("<producer id=\"producer1\" in=\"0\" out=\"99999\"><property name=\"mlt_type\">producer</property><property name=\"length\">100000</property><property name=\"eof\">pause</property><property name=\"resource\">alsa:%5</property><property name=\"audio_index\">0</property><property name=\"video_index\">-1</property><property name=\"mlt_service\">avformat</property></producer><playlist id=\"playlist1\"><entry producer=\"producer1\" in=\"0\" out=\"99999\"/></playlist>").arg(KdenliveSettings::v4l_alsadevicename()));
-            }
-            else {
+            if (!KdenliveSettings::v4l_captureaudio()) {
                 // if we do not want audio, make sure that we don't have audio encoding parameters
                 // this is required otherwise the MLT avformat consumer will not close properly
                 if (v4lparameters.contains("acodec")) {
@@ -598,19 +597,6 @@ void RecMonitor::slotRecord()
                     v4lparameters = QString(v4lparameters.section("acodec", 0, 0) + "an=1 " + endParam).simplified();
                 }
             }
-            
-
-            playlist.append("<tractor id=\"tractor0\" title=\"video0\" global_feed=\"1\" in=\"0\" out=\"99999\">");
-
-            playlist.append("<track producer=\"playlist0\"/>");            
-
-            // Audio mix
-            if (KdenliveSettings::v4l_captureaudio()) {
-                playlist.append("<track producer=\"playlist1\"/>");
-                playlist.append("<transition id=\"transition0\" in=\"0\" out=\"0\"><property name=\"a_track\">0</property><property name=\"b_track\">1</property><property name=\"mlt_type\">transition</property><property name=\"mlt_service\">mix</property></transition>");
-            }
-
-            playlist.append("</tractor></mlt>");
 
             if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, recording_preview->currentIndex())) {
                 m_videoBox->setHidden(false);
@@ -714,6 +700,23 @@ void RecMonitor::slotRecord()
     }
 }
 
+const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile) {
+    
+    QString playlist = QString("<mlt title=\"capture\"><producer id=\"producer0\" in=\"0\" out=\"99999\"><property name=\"mlt_type\">producer</property><property name=\"length\">100000</property><property name=\"eof\">pause</property><property name=\"resource\">video4linux2:%1?width:%2&amp;height:%3&amp;frame_rate:%4</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist0\"><entry producer=\"producer0\" in=\"0\" out=\"99999\"/></playlist>").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
+    playlist.append("<tractor id=\"tractor0\" title=\"video0\" global_feed=\"1\" in=\"0\" out=\"99999\">");
+    playlist.append("<track producer=\"playlist0\"/>");
+    
+    if (KdenliveSettings::v4l_captureaudio()) {
+        playlist.append(QString("<producer id=\"producer1\" in=\"0\" out=\"99999\"><property name=\"mlt_type\">producer</property><property name=\"length\">100000</property><property name=\"eof\">pause</property><property name=\"resource\">alsa:%5</property><property name=\"audio_index\">0</property><property name=\"video_index\">-1</property><property name=\"mlt_service\">avformat</property></producer><playlist id=\"playlist1\"><entry producer=\"producer1\" in=\"0\" out=\"99999\"/></playlist>").arg(KdenliveSettings::v4l_alsadevicename()));
+
+        playlist.append("<track producer=\"playlist1\"/>");
+        playlist.append("<transition id=\"transition0\" in=\"0\" out=\"0\"><property name=\"a_track\">0</property><property name=\"b_track\">1</property><property name=\"mlt_type\">transition</property><property name=\"mlt_service\">mix</property></transition>");
+    }
+    
+    playlist.append("</tractor></mlt>");
+    return playlist;
+}
+
 /*
 void RecMonitor::slotStartGrab(const QRect &rect) {
     rgnGrab->deleteLater();
index 86cb0d97e286986f1894bc38b91f030fb32d28c6..2d07fd3a41b5b0779dcf04178bf9cb4eb731c7cb 100644 (file)
@@ -27,6 +27,7 @@
 #define RECMONITOR_H
 
 #include "abstractmonitor.h"
+#include "definitions.h"
 #include "ui_recmonitor_ui.h"
 
 #include <QToolBar>
@@ -104,6 +105,8 @@ private:
     void manageCapturedFiles();
     /** @brief Build MLT producer for device, using path as profile. */
     void buildMltDevice(const QString &path);
+    /** @brief Create string containing an XML playlist for v4l capture. */
+    const QString getV4lXmlPlaylist(MltVideoProfile profile);
 
 private slots:
     void slotStartPreview(bool play = true);