<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">
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");
} 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()));
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
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) {
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());
}
- 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;
}
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:
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);
QString v4lparameters;
MltVideoProfile profile;
bool showPreview;
+ bool isXml;
QString capturename = KdenliveSettings::dvgrabfilename();
if (capturename.isEmpty()) capturename = "capture";
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();
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);
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;
}
}
-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&height:%3&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&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den);
+
+ }
+
return playlist;
}
/** @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);
<x>0</x>
<y>0</y>
<width>405</width>
- <height>479</height>
+ <height>492</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_8">
</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>