]> git.sesse.net Git - kdenlive/commitdiff
Workaround audio capture issue:http://www.kdenlive.org/mantis/view.php?id=2841 -...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 26 Dec 2012 14:13:59 +0000 (15:13 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 26 Dec 2012 14:13:59 +0000 (15:13 +0100)
src/kdenlivesettings.kcfg
src/kdenlivesettingsdialog.cpp
src/mltdevicecapture.cpp
src/recmonitor.cpp
src/recmonitor.h
src/widgets/configcapture_ui.ui

index 4726b1f24c693040088ced58fc1d940df176d1a1..2df1a816a00d5d166328e12613b1d7ee09ec1d67 100644 (file)
       <label>Audio device for v4l capture.</label>
       <default></default>
     </entry>
+    
+    <entry name="alsachannels" type="UInt">
+      <label>Number of audio channels.</label>
+      <default>2</default>
+    </entry>
 
     <entry name="v4l_alsadevicename" type="String">
       <label>Audio device for v4l capture.</label>
-      <default>hw:0,0</default>
+      <default>default</default>
     </entry>
 
     <entry name="v4l_parameters" type="String">
index 847bad756890117d8fd4dd81c66bedfb0cc6da5f..c213043f30fb031efae5b4e16b588cf57436214e 100644 (file)
@@ -385,9 +385,10 @@ void KdenliveSettingsDialog::initDevices()
     m_configSdl.kcfg_video_driver->addItem(i18n("Ascii art library"), "aalib");
 #endif
 
-    // Fill the list of audio playback devices
+    // Fill the list of audio playback / recording devices
     m_configSdl.kcfg_audio_device->addItem(i18n("Default"), QString());
     m_configCapture.kcfg_rmd_alsa_device->addItem(i18n("Default"), QString());
+    m_configCapture.kcfg_v4l_alsadevice->addItem(i18n("Default"), "default");
     if (!KStandardDirs::findExe("aplay").isEmpty()) {
         m_readProcess.setOutputChannelMode(KProcess::OnlyStdoutChannel);
         m_readProcess.setProgram("aplay", QStringList() << "-l");
@@ -396,12 +397,11 @@ void KdenliveSettingsDialog::initDevices()
     } else {
         // If aplay is not installed on the system, parse the /proc/asound/pcm file
         QFile file("/proc/asound/pcm");
-        if (file.open(QIODevice::ReadOnly)) {
+        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
             QTextStream stream(&file);
-            QString line;
+            QString line = stream.readLine();
             QString deviceId;
-            while (!stream.atEnd()) {
-                line = stream.readLine();
+           while (!line.isNull()) {
                 if (line.contains("playback")) {
                     deviceId = line.section(':', 0, 0);
                     m_configSdl.kcfg_audio_device->addItem(line.section(':', 1, 1), "plughw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
@@ -411,9 +411,10 @@ void KdenliveSettingsDialog::initDevices()
                     m_configCapture.kcfg_rmd_alsa_device->addItem(line.section(':', 1, 1).simplified(), "plughw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
                     m_configCapture.kcfg_v4l_alsadevice->addItem(line.section(':', 1, 1).simplified(), "hw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
                 }
+                line = stream.readLine();
             }
             file.close();
-        }
+        } else kDebug()<<" / / / /CANNOT READ PCM";
     }
     
     // Add pulseaudio capture option
index 948e86e6415bdbbeadc8dd60fdadea80553d76ba..6a23773d9f3cd06500eb9f60f0a73ae71856440f 100644 (file)
@@ -184,7 +184,8 @@ void MltDeviceCapture::stop()
     
     if (m_mltConsumer) {
         m_mltConsumer->set("refresh", 0);
-        m_mltConsumer->stop();
+        m_mltConsumer->purge();
+       m_mltConsumer->stop();
         //if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
     }
     if (m_mltProducer) {
@@ -449,7 +450,7 @@ bool MltDeviceCapture::slotStartCapture(const QString &params, const QString &pa
     renderProps->set("mlt_service", "avformat");
     renderProps->set("target", path.toUtf8().constData());
     renderProps->set("real_time", -KdenliveSettings::mltthreads());
-    renderProps->set("terminate_on_pause", 0);
+    //renderProps->set("terminate_on_pause", 0);
     renderProps->set("mlt_profile", m_activeProfile.toUtf8().constData());
     
 
@@ -518,19 +519,25 @@ bool MltDeviceCapture::slotStartCapture(const QString &params, const QString &pa
         
     }
     
-    tmp = qstrdup(playlist.toUtf8().constData());
     if (xmlPlaylist) {
         // create an xml producer
-        m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", tmp);
+        m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
     }
     else {
         // create a producer based on mltproducer parameter
-        m_mltProducer = new Mlt::Producer(*m_mltProfile, tmp);
+        m_mltProducer = new Mlt::Producer(*m_mltProfile, playlist.toUtf8().constData());
     }
-    delete[] tmp;
 
     if (m_mltProducer == NULL || !m_mltProducer->is_valid()) {
         kDebug()<<"//// ERROR CREATRING PROD";
+       if (m_mltConsumer) {
+            delete m_mltConsumer;
+            m_mltConsumer = NULL;
+        }
+       if (m_mltProducer) {
+           delete m_mltProducer;
+           m_mltProducer = NULL;
+       }
         return false;
     }
     
index 1a1d14261b6e17133257f31ca750e7ee7c0861ed..3530422514ab60bd096fd3d20b2f1ebd61cad682 100644 (file)
@@ -451,6 +451,7 @@ void RecMonitor::slotStartPreview(bool play)
     QString producer;
     QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(' ', QString::SkipEmptyParts);
     int ix = device_selector->currentIndex();
+    bool isXml;
     videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC && ix != FIREWIRE);
     switch (ix) {
     case FIREWIRE:
@@ -499,10 +500,10 @@ void RecMonitor::slotStartPreview(bool play)
         path = KStandardDirs::locateLocal("appdata", "profiles/video4linux");
         buildMltDevice(path);
         profile = ProfilesDialog::getVideoProfile(path);
-        producer = getV4lXmlPlaylist(profile);
+        producer = getV4lXmlPlaylist(profile, &isXml);
 
         //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)) {
+        if (!m_captureDevice->slotStartPreview(producer, isXml)) {
             // v4l capture failed to start
             video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
             videoBox->setHidden(true);
@@ -590,6 +591,7 @@ void RecMonitor::slotRecord()
         QString v4lparameters;
         MltVideoProfile profile;
         bool showPreview;
+       bool isXml;
         QString capturename = KdenliveSettings::dvgrabfilename();
         if (capturename.isEmpty()) capturename = "capture";
 
@@ -600,7 +602,7 @@ void RecMonitor::slotRecord()
             profile = ProfilesDialog::getVideoProfile(path);
             //m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den);
             buildMltDevice(path);
-            playlist = getV4lXmlPlaylist(profile);
+            playlist = getV4lXmlPlaylist(profile, &isXml);
 
             v4lparameters = KdenliveSettings::v4l_parameters();
 
@@ -639,7 +641,7 @@ void RecMonitor::slotRecord()
             showPreview = m_previewSettings->isChecked();
             if (!rec_video->isChecked()) showPreview = false;
 
-            if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview)) {
+            if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview, isXml)) {
                 videoBox->setHidden(false);
                 m_isCapturing = true;
                 m_recAction->setEnabled(false);
@@ -649,6 +651,9 @@ void RecMonitor::slotRecord()
             else {
                 video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
                 videoBox->setHidden(true);
+               m_recAction->blockSignals(true);
+               m_recAction->setChecked(false);
+               m_recAction->blockSignals(false);
                 m_isCapturing = false;
             }
             break;
@@ -742,22 +747,34 @@ void RecMonitor::slotRecord()
     }
 }
 
-const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile) {
-
-    QString playlist = QString("<mlt title=\"capture\" LC_NUMERIC=\"C\"><profile description=\"v4l\" width=\"%1\" height=\"%2\" progressive=\"%3\" sample_aspect_num=\"%4\" sample_aspect_den=\"%5\" display_aspect_num=\"%6\" display_aspect_den=\"%7\" frame_rate_num=\"%8\" frame_rate_den=\"%9\" colorspace=\"%10\"/>").arg(profile.width).arg(profile.height).arg(profile.progressive).arg(profile.sample_aspect_num).arg(profile.sample_aspect_den).arg(profile.display_aspect_num).arg(profile.display_aspect_den).arg(profile.frame_rate_num).arg(profile.frame_rate_den).arg(profile.colorspace);
+const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile, bool *isXml) 
+{
+    QString playlist;
+    if (rec_video->isChecked() && rec_audio->isChecked()) {
+       // We want to capture audio and video, use xml playlist
+       *isXml = true;
+       playlist = QString("<mlt title=\"capture\" LC_NUMERIC=\"C\"><profile description=\"v4l\" width=\"%1\" height=\"%2\" progressive=\"%3\" sample_aspect_num=\"%4\" sample_aspect_den=\"%5\" display_aspect_num=\"%6\" display_aspect_den=\"%7\" frame_rate_num=\"%8\" frame_rate_den=\"%9\" colorspace=\"%10\"/>").arg(profile.width).arg(profile.height).arg(profile.progressive).arg(profile.sample_aspect_num).arg(profile.sample_aspect_den).arg(profile.display_aspect_num).arg(profile.display_aspect_den).arg(profile.frame_rate_num).arg(profile.frame_rate_den).arg(profile.colorspace);
 
-    if (rec_video->isChecked()) {
         playlist.append(QString("<producer id=\"producer0\" in=\"0\" out=\"999999\"><property name=\"mlt_type\">producer</property><property name=\"length\">1000000</property><property name=\"eof\">loop</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=\"999999\"/></playlist>").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den));
-    }
+    
+        playlist.append(QString("<producer id=\"producer1\" in=\"0\" out=\"999999\"><property name=\"mlt_type\">producer</property><property name=\"length\">1000000</property><property name=\"resource\">alsa:%1?channels=%2</property><property name=\"audio_index\">0</property><property name=\"video_index\">-1</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist1\"><entry producer=\"producer1\" in=\"0\" out=\"999999\"/></playlist>").arg(KdenliveSettings::v4l_alsadevicename()).arg(KdenliveSettings::alsachannels()));
 
-    if (rec_audio->isChecked()) {
-        playlist.append(QString("<producer id=\"producer1\" in=\"0\" out=\"999999\"><property name=\"mlt_type\">producer</property><property name=\"length\">1000000</property><property name=\"eof\">loop</property><property name=\"resource\">alsa:%5</property><property name=\"audio_index\">0</property><property name=\"video_index\">-1</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist1\"><entry producer=\"producer1\" in=\"0\" out=\"999999\"/></playlist>").arg(KdenliveSettings::v4l_alsadevicename()));
+       playlist.append("<tractor id=\"tractor0\" title=\"video0\" global_feed=\"1\" in=\"0\" out=\"999999\">");
+       playlist.append("<track producer=\"playlist0\"/><track producer=\"playlist1\"/>");
+       playlist.append("</tractor></mlt>");
     }
-    playlist.append("<tractor id=\"tractor0\" title=\"video0\" global_feed=\"1\" in=\"0\" out=\"999999\">");
-    if (rec_video->isChecked()) playlist.append("<track producer=\"playlist0\"/>");
-    if (rec_audio->isChecked()) playlist.append("<track producer=\"playlist1\"/>");
-    playlist.append("</tractor></mlt>");
-
+    else if (rec_audio->isChecked()) {
+       // Audio only recording
+       *isXml = false;
+       playlist =QString("alsa:%1?channels=%2").arg(KdenliveSettings::v4l_alsadevicename()).arg(KdenliveSettings::alsachannels());
+    }
+    else {
+       // Video only recording
+       *isXml = false;
+       playlist =QString("video4linux2:%1?width:%2&amp;height:%3&amp;frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
+       
+    }
+    
     return playlist;
 }
 
index aeb1029019af80e1a3c171c830a57e6320171f0c..16063fafdfde60a5245cda57097f207f0f38d94f 100644 (file)
@@ -108,7 +108,7 @@ private:
     /** @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);
+    const QString getV4lXmlPlaylist(MltVideoProfile profile, bool *isXml);
 
 private slots:
     void slotStartPreview(bool play = true);
index 08652d62d90d70a64798c8ec407b5d535c3a6eff..294454c982b48420426a8a307d673c8e5b025041 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>405</width>
-    <height>479</height>
+    <height>492</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout_8">
@@ -63,7 +63,7 @@
       </size>
      </property>
      <property name="currentIndex">
-      <number>0</number>
+      <number>1</number>
      </property>
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>FFmpeg</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout">
-       <item row="1" column="0" colspan="2">
-        <widget class="QLabel" name="label_30">
+       <item row="15" column="8">
+        <widget class="QLabel" name="label_11">
          <property name="text">
-          <string>Detected devices</string>
+          <string>Channels</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="4" colspan="4">
+       <item row="1" column="6" colspan="5">
         <widget class="KComboBox" name="kcfg_detectedv4ldevices"/>
        </item>
        <item row="2" column="0" colspan="2">
          </property>
         </widget>
        </item>
-       <item row="2" column="4" colspan="4">
-        <widget class="KLineEdit" name="kcfg_video4vdevice">
+       <item row="1" column="0" colspan="2">
+        <widget class="QLabel" name="label_30">
          <property name="text">
-          <string/>
+          <string>Detected devices</string>
+         </property>
+        </widget>
+       </item>
+       <item row="18" column="9">
+        <widget class="QToolButton" name="v4l_showprofileinfo">
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
          </property>
         </widget>
        </item>
-       <item row="3" column="4" colspan="4">
+       <item row="3" column="6" colspan="5">
         <widget class="KComboBox" name="kcfg_v4l_format"/>
        </item>
        <item row="4" column="0">
          </property>
         </widget>
        </item>
-       <item row="4" column="4" colspan="4">
+       <item row="4" column="6" colspan="5">
         <widget class="QLabel" name="p_size">
          <property name="text">
           <string>720x576</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="4" colspan="4">
+       <item row="5" column="6" colspan="5">
         <widget class="QLabel" name="p_fps">
          <property name="text">
           <string>25/1</string>
          </property>
         </widget>
        </item>
+       <item row="2" column="6" colspan="5">
+        <widget class="KLineEdit" name="kcfg_video4vdevice">
+         <property name="text">
+          <string/>
+         </property>
+        </widget>
+       </item>
        <item row="6" column="0" colspan="2">
         <widget class="QLabel" name="label_23">
          <property name="text">
          </property>
         </widget>
        </item>
-       <item row="6" column="4" colspan="4">
+       <item row="6" column="6" colspan="5">
         <widget class="QLabel" name="p_aspect">
          <property name="text">
           <string>59/54</string>
          </property>
         </widget>
        </item>
-       <item row="7" column="0" colspan="3">
+       <item row="7" column="0" colspan="5">
         <widget class="QLabel" name="label_31">
          <property name="text">
           <string>Display aspect ratio:</string>
          </property>
         </widget>
        </item>
-       <item row="7" column="4" colspan="4">
+       <item row="7" column="6" colspan="5">
         <widget class="QLabel" name="p_display">
          <property name="text">
           <string>4/3</string>
          </property>
         </widget>
        </item>
-       <item row="8" column="4" colspan="4">
+       <item row="8" column="6" colspan="5">
         <widget class="QLabel" name="p_colorspace">
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
+       <item row="9" column="8" colspan="3">
+        <widget class="QPushButton" name="config_v4l">
+         <property name="text">
+          <string>Edit</string>
+         </property>
+        </widget>
+       </item>
+       <item row="10" column="0" rowspan="4" colspan="11">
+        <widget class="Line" name="line">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
        <item row="9" column="0" colspan="2">
         <widget class="QLabel" name="p_progressive">
          <property name="text">
          </property>
         </widget>
        </item>
-       <item row="9" column="4" colspan="2">
+       <item row="9" column="6" colspan="2">
         <spacer name="horizontalSpacer_5">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
         </spacer>
        </item>
-       <item row="9" column="6" colspan="2">
-        <widget class="QPushButton" name="config_v4l">
-         <property name="text">
-          <string>Edit</string>
-         </property>
-        </widget>
-       </item>
-       <item row="10" column="0" rowspan="4" colspan="8">
-        <widget class="Line" name="line">
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="14" column="0" colspan="8">
+       <item row="14" column="0" colspan="11">
         <widget class="QCheckBox" name="kcfg_v4l_captureaudio">
          <property name="text">
           <string>Capture audio (ALSA)</string>
          </property>
         </widget>
        </item>
-       <item row="17" column="0" colspan="8">
+       <item row="17" column="0" colspan="11">
         <widget class="Line" name="line_2">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
         </widget>
        </item>
-       <item row="18" column="4">
-        <widget class="KComboBox" name="kcfg_v4l_profile">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-        </widget>
-       </item>
-       <item row="20" column="0" colspan="8">
-        <widget class="QPlainTextEdit" name="v4l_parameters">
-         <property name="readOnly">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="21" column="1" colspan="4">
+       <item row="21" column="1" colspan="6">
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
         </spacer>
        </item>
-       <item row="18" column="7">
-        <widget class="QToolButton" name="v4l_manageprofile">
-         <property name="text">
-          <string>...</string>
+       <item row="20" column="0" colspan="11">
+        <widget class="QPlainTextEdit" name="v4l_parameters">
+         <property name="readOnly">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="18" column="6">
-        <widget class="QToolButton" name="v4l_showprofileinfo">
+       <item row="0" column="0" colspan="11">
+        <widget class="QCheckBox" name="kcfg_v4l_capturevideo">
          <property name="text">
-          <string>...</string>
-         </property>
-         <property name="checkable">
-          <bool>true</bool>
+          <string>Capture video (Video4Linux2)</string>
          </property>
         </widget>
        </item>
-       <item row="15" column="0">
-        <widget class="QLabel" name="label_3">
+       <item row="18" column="10">
+        <widget class="QToolButton" name="v4l_manageprofile">
          <property name="text">
-          <string>Device</string>
+          <string>...</string>
          </property>
         </widget>
        </item>
-       <item row="15" column="4" colspan="4">
-        <widget class="KComboBox" name="kcfg_v4l_alsadevice">
+       <item row="15" column="9" colspan="2">
+        <widget class="QSpinBox" name="kcfg_alsachannels"/>
+       </item>
+       <item row="18" column="6" colspan="3">
+        <widget class="KComboBox" name="kcfg_v4l_profile">
          <property name="sizePolicy">
           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
            <horstretch>0</horstretch>
          </property>
         </widget>
        </item>
-       <item row="0" column="0" colspan="8">
-        <widget class="QCheckBox" name="kcfg_v4l_capturevideo">
-         <property name="text">
-          <string>Capture video (Video4Linux2)</string>
+       <item row="15" column="0" colspan="8">
+        <widget class="KComboBox" name="kcfg_v4l_alsadevice">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
          </property>
         </widget>
        </item>