From 72afb974a98c4ecde0a892c5ed35519d63a576d2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 22 Dec 2011 00:51:11 +0100 Subject: [PATCH] Audio recording (works even while playing project, nice for voiceover) --- src/kdenlivesettings.kcfg | 5 ++ src/kdenlivesettingsdialog.cpp | 11 ++-- src/recmonitor.cpp | 62 +++++++++++++----- src/recmonitor.h | 4 ++ src/widgets/configcapture_ui.ui | 113 ++++++++++++++++++-------------- src/widgets/recmonitor_ui.ui | 64 +++++++++--------- 6 files changed, 151 insertions(+), 108 deletions(-) diff --git a/src/kdenlivesettings.kcfg b/src/kdenlivesettings.kcfg index 29ae167c..f58b8233 100644 --- a/src/kdenlivesettings.kcfg +++ b/src/kdenlivesettings.kcfg @@ -352,6 +352,11 @@ 0 + + + true + + false diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index ca975e37..e2eaca7c 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -112,7 +112,6 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap& map } connect(m_configCapture.kcfg_detectedv4ldevices, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lDevice())); connect(m_configCapture.kcfg_v4l_format, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lCaptureProfile())); - connect(m_configCapture.kcfg_v4l_captureaudio, SIGNAL(toggled(bool)), m_configCapture.kcfg_v4l_alsadevice, SLOT(setEnabled(bool))); connect(m_configCapture.config_v4l, SIGNAL(clicked()), this, SLOT(slotEditVideo4LinuxProfile())); slotUpdatev4lDevice(); @@ -393,8 +392,8 @@ void KdenliveSettingsDialog::initDevices() } if (line.contains("capture")) { deviceId = line.section(':', 0, 0); - m_configCapture.kcfg_rmd_alsa_device->addItem(line.section(':', 1, 1), "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), "hw:" + 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())); } } file.close(); @@ -440,9 +439,9 @@ void KdenliveSettingsDialog::slotReadAudioDevices() if (!data.startsWith(" ") && data.count(':') > 1) { QString card = data.section(':', 0, 0).section(' ', -1); QString device = data.section(':', 1, 1).section(' ', -1); - m_configSdl.kcfg_audio_device->addItem(data.section(':', -1), "plughw:" + card + ',' + device); - m_configCapture.kcfg_rmd_alsa_device->addItem(data.section(':', -1), "plughw:" + card + ',' + device); - m_configCapture.kcfg_v4l_alsadevice->addItem(data.section(':', -1), "hw:" + card + ',' + device); + m_configSdl.kcfg_audio_device->addItem(data.section(':', -1).simplified(), "plughw:" + card + ',' + device); + m_configCapture.kcfg_rmd_alsa_device->addItem(data.section(':', -1).simplified(), "plughw:" + card + ',' + device); + m_configCapture.kcfg_v4l_alsadevice->addItem(data.section(':', -1).simplified(), "hw:" + card + ',' + device); } } } diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 067fca0a..298080af 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -93,6 +93,23 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : m_recAction = toolbar->addAction(KIcon("media-record"), i18n("Record")); connect(m_recAction, SIGNAL(triggered()), this, SLOT(slotRecord())); m_recAction->setCheckable(true); + + rec_options->setIcon(KIcon("system-run")); + QMenu *menu = new QMenu(this); + m_addCapturedClip = new QAction(i18n("Add Captured File to Project"), this); + m_addCapturedClip->setCheckable(true); + m_addCapturedClip->setChecked(true); + menu->addAction(m_addCapturedClip); + + rec_audio->setChecked(KdenliveSettings::v4l_captureaudio()); + rec_video->setChecked(KdenliveSettings::v4l_capturevideo()); + + m_previewSettings = new KSelectAction(i18n("Preview Settings"), this); + m_previewSettings->addAction(i18n("Quick preview")); + m_previewSettings->addAction(i18n("Full preview")); + m_previewSettings->addAction(i18n("No preview")); + rec_options->setMenu(menu); + menu->addAction(m_previewSettings); toolbar->addSeparator(); @@ -152,9 +169,8 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : kDebug() << "/////// BUILDING MONITOR, ID: " << video_frame->winId(); slotVideoDeviceChanged(device_selector->currentIndex()); - recording_preview->setToolTip(i18n("Capture preview settings")); - recording_preview->setCurrentIndex(KdenliveSettings::recording_preview()); - connect(recording_preview, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeRecordingPreview(int))); + m_previewSettings->setCurrentItem(KdenliveSettings::recording_preview()); + connect(m_previewSettings, SIGNAL(triggered(int)), this, SLOT(slotChangeRecordingPreview(int))); } RecMonitor::~RecMonitor() @@ -203,7 +219,9 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { QString capturefile; QString capturename; - recording_preview->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + m_previewSettings->setEnabled(ix == VIDEO4LINUX || ix == BLACKMAGIC); + rec_audio->setVisible(ix == VIDEO4LINUX); + rec_video->setVisible(ix == VIDEO4LINUX); m_fwdAction->setVisible(ix == FIREWIRE); m_discAction->setVisible(ix == FIREWIRE); m_rewAction->setVisible(ix == FIREWIRE); @@ -379,7 +397,7 @@ void RecMonitor::slotStopCapture() if (m_captureDevice) { m_captureDevice->stop(); } - recording_preview->setEnabled(true); + m_previewSettings->setEnabled(true); m_isCapturing = false; m_isPlaying = false; m_playAction->setEnabled(true); @@ -388,7 +406,7 @@ void RecMonitor::slotStopCapture() slotSetInfoMessage(i18n("Capture stopped")); m_isCapturing = false; m_recAction->setChecked(false); - if (autoaddbox->isChecked() && !m_captureFile.isEmpty() && QFile::exists(m_captureFile.path())) { + if (m_addCapturedClip->isChecked() && !m_captureFile.isEmpty() && QFile::exists(m_captureFile.path())) { emit addProjectClip(m_captureFile); m_captureFile.clear(); } @@ -539,7 +557,11 @@ void RecMonitor::slotRecord() m_recAction->setChecked(true); QString extension = "mpg"; if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); - else if (device_selector->currentIndex() == VIDEO4LINUX) extension = KdenliveSettings::v4l_extension(); + else if (device_selector->currentIndex() == VIDEO4LINUX) { + // TODO: when recording audio only, allow configuration? + if (!rec_video->isChecked()) extension = "wav"; + else extension = KdenliveSettings::v4l_extension(); + } else if (device_selector->currentIndex() == BLACKMAGIC) extension = KdenliveSettings::decklink_extension(); QString path = KUrl(m_capturePath).path(KUrl::AddTrailingSlash) + "capture0000." + extension; int i = 1; @@ -568,9 +590,12 @@ void RecMonitor::slotRecord() playlist = getV4lXmlPlaylist(profile); v4lparameters = KdenliveSettings::v4l_parameters(); + + // TODO: when recording audio only, allow param configuration? + if (!rec_video->isChecked()) v4lparameters.clear(); // Add alsa audio capture - if (!KdenliveSettings::v4l_captureaudio()) { + if (!rec_audio->isChecked()) { // 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,12 +623,12 @@ void RecMonitor::slotRecord() } } - if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, recording_preview->currentIndex())) { + if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, m_previewSettings->currentItem())) { m_videoBox->setHidden(false); m_isCapturing = true; m_recAction->setEnabled(false); m_stopAction->setEnabled(true); - recording_preview->setEnabled(false); + m_previewSettings->setEnabled(false); } else { video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); @@ -620,13 +645,13 @@ void RecMonitor::slotRecord() playlist = QString("producer100000pause%1decklink").arg(KdenliveSettings::decklink_capturedevice()); - if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), recording_preview->currentIndex(), false)) { + if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), m_previewSettings->currentItem(), false)) { m_videoBox->setHidden(false); m_isCapturing = true; slotSetInfoMessage(i18n("Capturing to %1", m_captureFile.fileName())); m_recAction->setEnabled(false); m_stopAction->setEnabled(true); - recording_preview->setEnabled(false); + m_previewSettings->setEnabled(false); } else { video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); @@ -704,15 +729,16 @@ const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile) { QString playlist = QString("").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); - playlist.append(QString("producer1000000loopvideo4linux2:%1?width:%2&height:%3&frame_rate:%4avformat-novalidate").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den)); - + if (rec_video->isChecked()) { + playlist.append(QString("producer1000000loopvideo4linux2:%1?width:%2&height:%3&frame_rate:%4avformat-novalidate").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den)); + } - if (KdenliveSettings::v4l_captureaudio()) { + if (rec_audio->isChecked()) { playlist.append(QString("producer1000000loopalsa:%50-1avformat-novalidate").arg(KdenliveSettings::v4l_alsadevicename())); } playlist.append(""); - playlist.append(""); - if (KdenliveSettings::v4l_captureaudio()) playlist.append(""); + if (rec_video->isChecked()) playlist.append(""); + if (rec_audio->isChecked()) playlist.append(""); playlist.append(""); return playlist; @@ -752,7 +778,7 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) if (status == QProcess::NotRunning) { m_displayProcess->kill(); if (m_isCapturing && device_selector->currentIndex() != FIREWIRE) - if (autoaddbox->isChecked() && !m_captureFile.isEmpty() && QFile::exists(m_captureFile.path())) { + if (m_addCapturedClip->isChecked() && !m_captureFile.isEmpty() && QFile::exists(m_captureFile.path())) { emit addProjectClip(m_captureFile); m_captureFile.clear(); } diff --git a/src/recmonitor.h b/src/recmonitor.h index 2d07fd3a..52106462 100644 --- a/src/recmonitor.h +++ b/src/recmonitor.h @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -99,6 +100,9 @@ private: MonitorManager *m_manager; MltDeviceCapture *m_captureDevice; VideoPreviewContainer *m_videoBox; + QAction *m_addCapturedClip; + KSelectAction *m_previewSettings; + bool m_analyse; void checkDeviceAvailability(); QPixmap mergeSideBySide(const QPixmap& pix, const QString &txt); diff --git a/src/widgets/configcapture_ui.ui b/src/widgets/configcapture_ui.ui index 371a78d1..96ea43b1 100644 --- a/src/widgets/configcapture_ui.ui +++ b/src/widgets/configcapture_ui.ui @@ -7,7 +7,7 @@ 0 0 405 - 545 + 595 @@ -178,121 +178,121 @@ - Video4Linux + FFmpeg - + Detected devices - + - + Video device - + - + Capture format - + - + Size: - + 720x576 - + Frame rate: - + 25/1 - + Pixel aspect ratio: - + 59/54 - + Display aspect ratio: - + 4/3 - + Colorspace - + - + Interlaced - + Qt::Horizontal @@ -305,35 +305,35 @@ - + Edit - + Qt::Horizontal - + Capture audio (ALSA) - + Qt::Horizontal - + @@ -346,7 +346,7 @@ - + @@ -356,7 +356,7 @@ - + @@ -369,7 +369,7 @@ - + Qt::Vertical @@ -382,27 +382,14 @@ - - - - false - - - - 0 - 0 - - - - - + ... - + ... @@ -412,6 +399,30 @@ + + + + Device + + + + + + + + 0 + 0 + + + + + + + + Capture video (Video4Linux2) + + + @@ -906,25 +917,25 @@ - - KIntSpinBox - QSpinBox -
knuminput.h
-
KDoubleNumInput QWidget
knuminput.h
+ + KComboBox + QComboBox +
kcombobox.h
+
KLineEdit QLineEdit
klineedit.h
- KComboBox - QComboBox -
kcombobox.h
+ KIntSpinBox + QSpinBox +
knuminput.h
KIntNumInput diff --git a/src/widgets/recmonitor_ui.ui b/src/widgets/recmonitor_ui.ui index 6194a34f..3eb18358 100644 --- a/src/widgets/recmonitor_ui.ui +++ b/src/widgets/recmonitor_ui.ui @@ -6,15 +6,15 @@ 0 0 - 291 - 184 + 285 + 157 0 - + Not connected @@ -24,7 +24,7 @@ - + @@ -46,17 +46,7 @@ - - - - Auto add - - - true - - - - + @@ -65,7 +55,7 @@ - Video4Linux + FFmpeg @@ -80,7 +70,7 @@ - + Qt::Horizontal @@ -94,22 +84,30 @@ - - - - Quick preview - - - - - Full preview - - - - - No preview - - + + + Video + + + + + + + Audio + + + + + + + ... + + + QToolButton::InstantPopup + + + true + -- 2.39.2