From 3817a499ed6f10f0bcf1fdd4ae5451c2d0041d26 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 21 Dec 2011 16:27:17 +0100 Subject: [PATCH] * Play audio when previewing in v4l capture mode * Connect to audio levels so that we can preview the volume * Add Pulseaudio capture to v4l --- icons/CMakeLists.txt | 2 +- src/abstractmonitor.h | 2 +- src/audiosignal.cpp | 3 ++- src/kdenlivesettingsdialog.cpp | 4 ++++ src/mainwindow.cpp | 5 +++- src/mltdevicecapture.cpp | 5 ++-- src/mltdevicecapture.h | 3 --- src/recmonitor.cpp | 43 ++++++++++++++++++---------------- src/recmonitor.h | 3 +++ 9 files changed, 40 insertions(+), 30 deletions(-) diff --git a/icons/CMakeLists.txt b/icons/CMakeLists.txt index 6ab32fbd..c41644a6 100644 --- a/icons/CMakeLists.txt +++ b/icons/CMakeLists.txt @@ -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} ) diff --git a/src/abstractmonitor.h b/src/abstractmonitor.h index 1167e6c4..c58ae0e0 100644 --- a/src/abstractmonitor.h +++ b/src/abstractmonitor.h @@ -95,7 +95,7 @@ signals: void frameUpdated(QImage); /** @brief This signal contains the audio of the current frame. */ - void audioSamplesSignal(QVector, int, int, int); + void audioSamplesSignal(const QVector&, const int&, const int&, const int&); }; class AbstractMonitor : public QWidget diff --git a/src/audiosignal.cpp b/src/audiosignal.cpp index 00c59465..3582148c 100644 --- a/src/audiosignal.cpp +++ b/src/audiosignal.cpp @@ -57,7 +57,8 @@ bool AudioSignal::monitoringEnabled() const return m_aMonitoringEnabled->isChecked(); } -void AudioSignal::slotReceiveAudio(const QVector& data, int, int num_channels, int samples){ +void AudioSignal::slotReceiveAudio(const QVector& data, int, int num_channels, int samples) +{ int num_samples = samples > 200 ? 200 : samples; diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index ff953b5b..ca975e37 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -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()); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6aedb516..498f4a69 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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(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&, const int&, const int&, const int&)), m_audiosignal, SLOT(slotReceiveAudio(const QVector&, const int&, const int&, const int&))); + } } void MainWindow::slotClearColorScopes() diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index c92b18c2..d58b3e05 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -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 sampleVector(samples*num_channels); memcpy(sampleVector.data(), data, samples*num_channels*sizeof(int16_t)); - if (samples > 0) { emit audioSamplesSignal(sampleVector, freq, num_channels, samples); } diff --git a/src/mltdevicecapture.h b/src/mltdevicecapture.h index ba757335..e25de57d 100644 --- a/src/mltdevicecapture.h +++ b/src/mltdevicecapture.h @@ -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&, int freq, int num_channels, int num_samples); void frameSaved(const QString &); diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 9ec0c442..59d4fc1f 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -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("producer100000pausevideo4linux2:%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); + playlist = getV4lXmlPlaylist(profile); v4lparameters = KdenliveSettings::v4l_parameters(); // Add alsa audio capture - if (KdenliveSettings::v4l_captureaudio()) { - playlist.append(QString("producer100000pausealsa:%50-1avformat").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(""); - - playlist.append(""); - - // Audio mix - if (KdenliveSettings::v4l_captureaudio()) { - playlist.append(""); - playlist.append("01transitionmix"); - } - - playlist.append(""); 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("producer100000pausevideo4linux2:%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); + playlist.append(""); + playlist.append(""); + + if (KdenliveSettings::v4l_captureaudio()) { + playlist.append(QString("producer100000pausealsa:%50-1avformat").arg(KdenliveSettings::v4l_alsadevicename())); + + playlist.append(""); + playlist.append("01transitionmix"); + } + + playlist.append(""); + return playlist; +} + /* void RecMonitor::slotStartGrab(const QRect &rect) { rgnGrab->deleteLater(); diff --git a/src/recmonitor.h b/src/recmonitor.h index 86cb0d97..2d07fd3a 100644 --- a/src/recmonitor.h +++ b/src/recmonitor.h @@ -27,6 +27,7 @@ #define RECMONITOR_H #include "abstractmonitor.h" +#include "definitions.h" #include "ui_recmonitor_ui.h" #include @@ -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); -- 2.39.2