From kde-commits Mon Feb 28 21:50:21 2011 From: Casian Andrei Date: Mon, 28 Feb 2011 21:50:21 +0000 To: kde-commits Subject: =?utf-8?q?=5Bphonon=5D_demos/simplecapture=3A_simplecapture=3A_A?= Message-Id: <20110228215021.9890BA60D7 () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129892987319943 Git commit 7517204fce92237c350657a35a29b660bc40b106 by Casian Andrei. Committed on 28/02/2011 at 18:26. Pushed by casianandrei into branch 'master'. simplecapture: Add method of capturing using AvCapture M +1 -1 demos/simplecapture/CMakeLists.txt M +128 -25 demos/simplecapture/capture.cpp M +38 -3 demos/simplecapture/capture.h http://commits.kde.org/phonon/7517204fce92237c350657a35a29b660bc40b106 diff --git a/demos/simplecapture/CMakeLists.txt b/demos/simplecapture/CMakeLists.txt index ff7c30b..4679ac1 100644 --- a/demos/simplecapture/CMakeLists.txt +++ b/demos/simplecapture/CMakeLists.txt @@ -18,4 +18,4 @@ qt4_automoc(${simplecapture_SRCS}) add_executable(simplecapture ${simplecapture_SRCS} ${simplecapture_MOC_SRCS}) -target_link_libraries(simplecapture ${QT_LIBRARIES} ${PHONON_LIBRARY}) +target_link_libraries(simplecapture ${QT_LIBRARIES} ${PHONON_LIBRARY} phononexperimental) diff --git a/demos/simplecapture/capture.cpp b/demos/simplecapture/capture.cpp index 75b0216..d4b84a3 100644 --- a/demos/simplecapture/capture.cpp +++ b/demos/simplecapture/capture.cpp @@ -24,8 +24,10 @@ #include #include #include +#include #include #include +#include // TODO AvCapture #include #include #include @@ -36,20 +38,12 @@ CaptureWidget::CaptureWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f) { - Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(this); - Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this); - Phonon::VideoCaptureDeviceModel *videoDeviceModel = new Phonon::VideoCaptureDeviceModel(this); - Phonon::AudioCaptureDeviceModel *audioDeviceModel = new Phonon::AudioCaptureDeviceModel(this); - - setLayout(new QVBoxLayout); - - videoWidget->setMinimumSize(QSize(400, 300)); - videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - layout()->addWidget(videoWidget); - m_media = new Phonon::MediaObject(this); - Phonon::createPath(m_media, audioOutput); - Phonon::createPath(m_media, videoWidget); + m_avcapture = new Phonon::Experimental::AvCapture(this); + m_captureNode = m_media; + + m_audioOutput = new Phonon::AudioOutput(this); + m_videoWidget = new Phonon::VideoWidget(this); m_playButton = new QPushButton(this); m_playButton->setText(tr("Play")); @@ -58,32 +52,141 @@ CaptureWidget::CaptureWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent m_stopButton = new QPushButton(this); m_stopButton->setText(tr("Stop")); m_stopButton->setEnabled(false); - connect(m_stopButton, SIGNAL(clicked()), m_media, SLOT(stop())); + connect(m_stopButton, SIGNAL(clicked()), this, SLOT(stop())); + + m_moButton = new QRadioButton(this); + m_moButton->setText(tr("Use MediaObject")); + m_moButton->setAutoExclusive(true); + m_moButton->setChecked(true); + connect(m_moButton, SIGNAL(toggled(bool)), this, SLOT(enableMOCapture(bool))); + + m_avcapButton = new QRadioButton(this); + m_avcapButton->setText(tr("Use Audio Video Capture (AvCapture)")); + m_avcapButton->setAutoExclusive(true); + connect(m_avcapButton, SIGNAL(toggled(bool)), this, SLOT(enableAvCapture(bool))); + + setLayout(new QVBoxLayout); + + m_videoWidget->setMinimumSize(QSize(400, 300)); + m_videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + layout()->addWidget(m_videoWidget); QHBoxLayout *buttonsLayout = new QHBoxLayout(); + buttonsLayout->addWidget(m_moButton); + buttonsLayout->addWidget(m_avcapButton); + layout()->addItem(buttonsLayout); + + buttonsLayout = new QHBoxLayout(); buttonsLayout->addWidget(m_playButton); buttonsLayout->addWidget(m_stopButton); layout()->addItem(buttonsLayout); - QList lv = Phonon::BackendCapabilities::availableVideoCaptureDevices(); - if (!lv.isEmpty()) { - Phonon::MediaSource source(lv.first()); - m_media->setCurrentSource(source); + setupCaptureSource(); + playPause(); +} + +void CaptureWidget::enableMOCapture(bool enable) +{ + if (!enable) + return; + + stop(); + m_captureNode = m_media; + setupCaptureSource(); +} + +void CaptureWidget::enableAvCapture(bool enable) +{ + if (!enable) + return; + + stop(); + m_captureNode = m_avcapture; + setupCaptureSource(); +} + +void CaptureWidget::setupCaptureSource() +{ + if (m_audioPath.isValid()) { + m_audioPath.disconnect(); + } + if (m_videoPath.isValid()) { + m_videoPath.disconnect(); + } + + if (m_captureNode == m_media) { + m_audioPath = Phonon::createPath(m_media, m_audioOutput); + m_videoPath = Phonon::createPath(m_media, m_videoWidget); + } + + if (m_captureNode == m_avcapture) { + m_audioPath = Phonon::createPath(m_avcapture, m_audioOutput); + m_videoPath = Phonon::createPath(m_avcapture, m_videoWidget); + } + + if (!m_audioPath.isValid()) { + QMessageBox::critical(this, "Error", "Your backend may not support audio capturing."); + } + if (!m_videoPath.isValid()) { + QMessageBox::critical(this, "Error", "Your backend may not support video capturing."); + } + + Phonon::GlobalConfig pgc; + + const Phonon::AudioCaptureDevice acd = Phonon::AudioCaptureDevice::fromIndex(pgc.audioCaptureDeviceFor(Phonon::NoCategory)); + if (acd.isValid()) { + if (m_captureNode == m_media) { + // m_media->setCurrentSource(acd); + } + + if (m_captureNode == m_avcapture) { + m_avcapture->setAudioCaptureDevice(acd); + } } else { - QMessageBox::critical(this, tr("Error"), tr("No video capture devices found.")); + QMessageBox::warning(this, tr("Warning"), tr("No audio capture devices found.")); } - connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State, Phonon::State))); + Phonon::VideoCaptureDevice vcd = Phonon::VideoCaptureDevice::fromIndex(pgc.videoCaptureDeviceFor(Phonon::NoCategory)); + if (vcd.isValid()) { + if (m_captureNode == m_media) { + m_media->setCurrentSource(vcd); + } - m_media->play(); + if (m_captureNode == m_avcapture) { + m_avcapture->setVideoCaptureDevice(vcd); + } + } else { + QMessageBox::warning(this, tr("Warning"), tr("No video capture devices found.")); + } + + connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State, Phonon::State))); } void CaptureWidget::playPause() { - if (m_media->state() == Phonon::PlayingState) { - m_media->pause(); - } else { - m_media->play(); + if (m_captureNode == m_media) { + if (m_media->state() == Phonon::PlayingState) { + m_media->stop(); + } else { + m_media->play(); + } + } + + if (m_captureNode == m_avcapture) { + // TODO AvCapture state + + m_avcapture->start(); + } +} + +void CaptureWidget::stop() +{ + if (m_captureNode == m_media) { + m_media->stop(); + } + + if (m_captureNode == m_avcapture) { + m_avcapture->stop(); } } diff --git a/demos/simplecapture/capture.h b/demos/simplecapture/capture.h index f30b32c..7919914 100644 --- a/demos/simplecapture/capture.h +++ b/demos/simplecapture/capture.h @@ -24,10 +24,20 @@ #include #include +#include class QPushButton; +class QRadioButton; + namespace Phonon { + class AudioOutput; + class MediaNode; class MediaObject; + class VideoWidget; + + namespace Experimental { + class AvCapture; + } } /** @@ -41,7 +51,6 @@ public: CaptureWidget(QWidget *parent = NULL, Qt::WindowFlags f = 0); private slots: - /** * @brief Updates the GUI when the underlying MediaObject changes states */ @@ -52,10 +61,36 @@ private slots: */ void playPause(); + /** + * @brief Stops the capture + */ + void stop(); + + /** + * @brief Switch to MediaObject capture method + */ + void enableMOCapture(bool enable); + + /** + * @brief Switch to AvCapture capture method + */ + void enableAvCapture(bool enable); + +private: + void setupCaptureSource(); + private: + Phonon::AudioOutput *m_audioOutput; + Phonon::VideoWidget *m_videoWidget; + Phonon::MediaNode *m_captureNode; Phonon::MediaObject *m_media; - QPushButton* m_playButton; - QPushButton* m_stopButton; + Phonon::Experimental::AvCapture *m_avcapture; + Phonon::Path m_audioPath; + Phonon::Path m_videoPath; + QPushButton *m_playButton; + QPushButton *m_stopButton; + QRadioButton *m_moButton; + QRadioButton *m_avcapButton; }; #endif // CAPTURE_H