diff --git a/examples/multimediawidgets/declarative-camera/CameraButton.qml b/examples/multimedia/declarative-camera/CameraButton.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/CameraButton.qml rename to examples/multimedia/declarative-camera/CameraButton.qml diff --git a/examples/multimediawidgets/declarative-camera/CameraPropertyButton.qml b/examples/multimedia/declarative-camera/CameraPropertyButton.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/CameraPropertyButton.qml rename to examples/multimedia/declarative-camera/CameraPropertyButton.qml diff --git a/examples/multimediawidgets/declarative-camera/CameraPropertyPopup.qml b/examples/multimedia/declarative-camera/CameraPropertyPopup.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/CameraPropertyPopup.qml rename to examples/multimedia/declarative-camera/CameraPropertyPopup.qml diff --git a/examples/multimediawidgets/declarative-camera/FocusButton.qml b/examples/multimedia/declarative-camera/FocusButton.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/FocusButton.qml rename to examples/multimedia/declarative-camera/FocusButton.qml diff --git a/examples/multimediawidgets/declarative-camera/PhotoCaptureControls.qml b/examples/multimedia/declarative-camera/PhotoCaptureControls.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/PhotoCaptureControls.qml rename to examples/multimedia/declarative-camera/PhotoCaptureControls.qml diff --git a/examples/multimediawidgets/declarative-camera/PhotoPreview.qml b/examples/multimedia/declarative-camera/PhotoPreview.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/PhotoPreview.qml rename to examples/multimedia/declarative-camera/PhotoPreview.qml diff --git a/examples/multimediawidgets/declarative-camera/VideoCaptureControls.qml b/examples/multimedia/declarative-camera/VideoCaptureControls.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/VideoCaptureControls.qml rename to examples/multimedia/declarative-camera/VideoCaptureControls.qml diff --git a/examples/multimediawidgets/declarative-camera/VideoPreview.qml b/examples/multimedia/declarative-camera/VideoPreview.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/VideoPreview.qml rename to examples/multimedia/declarative-camera/VideoPreview.qml diff --git a/examples/multimediawidgets/declarative-camera/ZoomControl.qml b/examples/multimedia/declarative-camera/ZoomControl.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/ZoomControl.qml rename to examples/multimedia/declarative-camera/ZoomControl.qml diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.pro b/examples/multimedia/declarative-camera/declarative-camera.pro similarity index 66% rename from examples/multimediawidgets/declarative-camera/declarative-camera.pro rename to examples/multimedia/declarative-camera/declarative-camera.pro index 5fb0a1b5..71d4f68b 100644 --- a/examples/multimediawidgets/declarative-camera/declarative-camera.pro +++ b/examples/multimedia/declarative-camera/declarative-camera.pro @@ -6,6 +6,6 @@ QT += quick qml multimedia SOURCES += qmlcamera.cpp RESOURCES += declarative-camera.qrc -target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/declarative-camera +target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/declarative-camera INSTALLS += target diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.qml b/examples/multimedia/declarative-camera/declarative-camera.qml similarity index 100% rename from examples/multimediawidgets/declarative-camera/declarative-camera.qml rename to examples/multimedia/declarative-camera/declarative-camera.qml diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.qmlproject b/examples/multimedia/declarative-camera/declarative-camera.qmlproject similarity index 100% rename from examples/multimediawidgets/declarative-camera/declarative-camera.qmlproject rename to examples/multimedia/declarative-camera/declarative-camera.qmlproject diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.qrc b/examples/multimedia/declarative-camera/declarative-camera.qrc similarity index 100% rename from examples/multimediawidgets/declarative-camera/declarative-camera.qrc rename to examples/multimedia/declarative-camera/declarative-camera.qrc diff --git a/examples/multimediawidgets/declarative-camera/doc/images/qml-camera.png b/examples/multimedia/declarative-camera/doc/images/qml-camera.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/doc/images/qml-camera.png rename to examples/multimedia/declarative-camera/doc/images/qml-camera.png diff --git a/examples/multimediawidgets/declarative-camera/doc/src/declarative-camera.qdoc b/examples/multimedia/declarative-camera/doc/src/declarative-camera.qdoc similarity index 100% rename from examples/multimediawidgets/declarative-camera/doc/src/declarative-camera.qdoc rename to examples/multimedia/declarative-camera/doc/src/declarative-camera.qdoc diff --git a/examples/multimediawidgets/declarative-camera/images/camera_auto_mode.png b/examples/multimedia/declarative-camera/images/camera_auto_mode.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_auto_mode.png rename to examples/multimedia/declarative-camera/images/camera_auto_mode.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_camera_setting.png b/examples/multimedia/declarative-camera/images/camera_camera_setting.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_camera_setting.png rename to examples/multimedia/declarative-camera/images/camera_camera_setting.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_flash_auto.png b/examples/multimedia/declarative-camera/images/camera_flash_auto.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_flash_auto.png rename to examples/multimedia/declarative-camera/images/camera_flash_auto.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_flash_fill.png b/examples/multimedia/declarative-camera/images/camera_flash_fill.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_flash_fill.png rename to examples/multimedia/declarative-camera/images/camera_flash_fill.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_flash_off.png b/examples/multimedia/declarative-camera/images/camera_flash_off.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_flash_off.png rename to examples/multimedia/declarative-camera/images/camera_flash_off.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_flash_redeye.png b/examples/multimedia/declarative-camera/images/camera_flash_redeye.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_flash_redeye.png rename to examples/multimedia/declarative-camera/images/camera_flash_redeye.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_white_balance_cloudy.png b/examples/multimedia/declarative-camera/images/camera_white_balance_cloudy.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_white_balance_cloudy.png rename to examples/multimedia/declarative-camera/images/camera_white_balance_cloudy.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_white_balance_flourescent.png b/examples/multimedia/declarative-camera/images/camera_white_balance_flourescent.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_white_balance_flourescent.png rename to examples/multimedia/declarative-camera/images/camera_white_balance_flourescent.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_white_balance_incandescent.png b/examples/multimedia/declarative-camera/images/camera_white_balance_incandescent.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_white_balance_incandescent.png rename to examples/multimedia/declarative-camera/images/camera_white_balance_incandescent.png diff --git a/examples/multimediawidgets/declarative-camera/images/camera_white_balance_sunny.png b/examples/multimedia/declarative-camera/images/camera_white_balance_sunny.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/camera_white_balance_sunny.png rename to examples/multimedia/declarative-camera/images/camera_white_balance_sunny.png diff --git a/examples/multimediawidgets/declarative-camera/images/toolbutton.png b/examples/multimedia/declarative-camera/images/toolbutton.png similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/toolbutton.png rename to examples/multimedia/declarative-camera/images/toolbutton.png diff --git a/examples/multimediawidgets/declarative-camera/images/toolbutton.sci b/examples/multimedia/declarative-camera/images/toolbutton.sci similarity index 100% rename from examples/multimediawidgets/declarative-camera/images/toolbutton.sci rename to examples/multimedia/declarative-camera/images/toolbutton.sci diff --git a/examples/multimediawidgets/declarative-camera/qmlcamera.cpp b/examples/multimedia/declarative-camera/qmlcamera.cpp similarity index 100% rename from examples/multimediawidgets/declarative-camera/qmlcamera.cpp rename to examples/multimedia/declarative-camera/qmlcamera.cpp diff --git a/examples/multimedia/multimedia.pro b/examples/multimedia/multimedia.pro index bacbba98..449cb150 100644 --- a/examples/multimedia/multimedia.pro +++ b/examples/multimedia/multimedia.pro @@ -13,8 +13,9 @@ qtHaveModule(widgets) { audiooutput \ } -qtHaveModule(gui):qtHaveModule(qml) { +qtHaveModule(quick) { SUBDIRS += \ + declarative-camera \ declarative-radio \ video } diff --git a/examples/multimedia/video/qmlvideo/main.cpp b/examples/multimedia/video/qmlvideo/main.cpp index 81c38d24..a14684ff 100644 --- a/examples/multimedia/video/qmlvideo/main.cpp +++ b/examples/multimedia/video/qmlvideo/main.cpp @@ -129,13 +129,11 @@ int main(int argc, char *argv[]) rootObject, SLOT(qmlFramePainted())); #endif - QUrl videoPath; const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation); - if (moviesLocation.isEmpty()) { - QUrl appPath(QString("file://%1").arg(app.applicationDirPath())); - videoPath = appPath.resolved(QUrl("./")); - } else - videoPath = QString("file://%1").arg(moviesLocation.first()); + const QUrl videoPath = + QUrl::fromLocalFile(moviesLocation.isEmpty() ? + app.applicationDirPath() : + moviesLocation.front()); viewer.rootContext()->setContextProperty("videoPath", videoPath); QMetaObject::invokeMethod(rootObject, "init"); diff --git a/examples/multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml b/examples/multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml index 18b7b0e0..b3e82c8d 100644 --- a/examples/multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml +++ b/examples/multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml @@ -101,7 +101,10 @@ Rectangle { Rectangle { id: wrapper function launch() { - var path = "file://" + filePath; + var path = "file://"; + if (filePath.length > 2 && filePath[1] === ':') // Windows drive logic, see QUrl::fromLocalFile() + path += '/'; + path += filePath; if (folders.isFolder(index)) down(path); else @@ -306,7 +309,7 @@ Rectangle { MouseArea { id: upRegion; anchors.centerIn: parent width: 56 height: 56 - onClicked: if (folders.parentFolder != "") up() + onClicked: up() } states: [ State { @@ -352,6 +355,8 @@ Rectangle { function up() { var path = folders.parentFolder; + if (path.toString().length === 0 || path.toString() === 'file:') + return; if (folders == folders1) { view = view2 folders = folders2; diff --git a/examples/multimediawidgets/multimediawidgets.pro b/examples/multimediawidgets/multimediawidgets.pro index d8990cdc..001a78d5 100644 --- a/examples/multimediawidgets/multimediawidgets.pro +++ b/examples/multimediawidgets/multimediawidgets.pro @@ -9,8 +9,3 @@ qtHaveModule(widgets) { player \ customvideosurface } - -qtHaveModule(gui):qtHaveModule(qml) { - disabled:SUBDIRS += declarative-camera -} - diff --git a/qtmultimedia.pro b/qtmultimedia.pro index 593dff24..d285c3cb 100644 --- a/qtmultimedia.pro +++ b/qtmultimedia.pro @@ -7,7 +7,7 @@ win32 { qtCompileTest(directshow) qtCompileTest(wmsdk) qtCompileTest(wmp) - qtCompileTest(wmf) + contains(QT_CONFIG, wmf-backend): qtCompileTest(wmf) qtCompileTest(evr) } else:mac { qtCompileTest(avfoundation) diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.cpp b/src/multimedia/audio/qsoundeffect_pulse_p.cpp index b3318ec9..328a3b0b 100644 --- a/src/multimedia/audio/qsoundeffect_pulse_p.cpp +++ b/src/multimedia/audio/qsoundeffect_pulse_p.cpp @@ -147,9 +147,20 @@ public: Q_SIGNALS: void contextReady(); + void contextFailed(); void volumeChanged(); -private: +private Q_SLOTS: + void onContextFailed() + { + release(); + + // Try to reconnect later + QTimer::singleShot(30000, this, SLOT(prepare())); + + emit contextFailed(); + } + void prepare() { m_vol = PA_VOLUME_NORM; @@ -196,12 +207,23 @@ private: m_prepared = true; } +private: void release() { - if (!m_prepared) return; - pa_context_unref(m_context); - pa_threaded_mainloop_stop(m_mainLoop); - pa_threaded_mainloop_free(m_mainLoop); + if (!m_prepared) + return; + + if (m_context) { + pa_context_unref(m_context); + m_context = 0; + } + + if (m_mainLoop) { + pa_threaded_mainloop_stop(m_mainLoop); + pa_threaded_mainloop_free(m_mainLoop); + m_mainLoop = 0; + } + m_prepared = false; } @@ -221,6 +243,9 @@ private: #endif QMetaObject::invokeMethod(self, "contextReady", Qt::QueuedConnection); break; + case PA_CONTEXT_FAILED: + QMetaObject::invokeMethod(self, "onContextFailed", Qt::QueuedConnection); + break; default: break; } @@ -511,7 +536,8 @@ void QSoundEffectPrivate::updateVolume() PulseDaemonLocker locker; pa_cvolume volume; volume.channels = m_pulseSpec.channels; - pa_operation_unref(pa_context_set_sink_input_volume(pulseDaemon()->context(), m_sinkInputId, pulseDaemon()->calcVolume(&volume, m_volume), setvolume_callback, m_ref->getRef())); + if (pulseDaemon()->context()) + pa_operation_unref(pa_context_set_sink_input_volume(pulseDaemon()->context(), m_sinkInputId, pulseDaemon()->calcVolume(&volume, m_volume), setvolume_callback, m_ref->getRef())); Q_ASSERT(pa_cvolume_valid(&volume)); #ifdef QT_PA_DEBUG qDebug() << this << "updateVolume =" << pa_cvolume_max(&volume); @@ -535,7 +561,8 @@ void QSoundEffectPrivate::updateMuted() if (m_sinkInputId < 0) return; PulseDaemonLocker locker; - pa_operation_unref(pa_context_set_sink_input_mute(pulseDaemon()->context(), m_sinkInputId, m_muted, setmuted_callback, m_ref->getRef())); + if (pulseDaemon()->context()) + pa_operation_unref(pa_context_set_sink_input_mute(pulseDaemon()->context(), m_sinkInputId, m_muted, setmuted_callback, m_ref->getRef())); #ifdef QT_PA_DEBUG qDebug() << this << "updateMuted = " << m_muted; #endif @@ -705,7 +732,7 @@ void QSoundEffectPrivate::sampleReady() } #endif } else { - if (pa_context_get_state(pulseDaemon()->context()) != PA_CONTEXT_READY) { + if (!pulseDaemon()->context() || pa_context_get_state(pulseDaemon()->context()) != PA_CONTEXT_READY) { connect(pulseDaemon(), SIGNAL(contextReady()), SLOT(contextReady())); return; } @@ -741,6 +768,7 @@ void QSoundEffectPrivate::unloadPulseStream() pa_stream_disconnect(m_pulseStream); pa_stream_unref(m_pulseStream); disconnect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume())); + disconnect(pulseDaemon(), SIGNAL(contextFailed()), this, SLOT(contextFailed())); m_pulseStream = 0; m_reloadCategory = false; // category will be reloaded when we connect anyway } @@ -895,6 +923,9 @@ void QSoundEffectPrivate::createPulseStream() qDebug() << this << "createPulseStream"; #endif + if (!pulseDaemon()->context()) + return; + pa_proplist *propList = pa_proplist_new(); if (m_category.isNull()) { // Meant to be one of the strings "video", "music", "game", "event", "phone", "animation", "production", "a11y", "test" @@ -906,6 +937,7 @@ void QSoundEffectPrivate::createPulseStream() pa_proplist_free(propList); connect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume())); + connect(pulseDaemon(), SIGNAL(contextFailed()), this, SLOT(contextFailed())); if (stream == 0) { qWarning("QSoundEffect(pulseaudio): Failed to create stream"); @@ -947,6 +979,12 @@ void QSoundEffectPrivate::contextReady() createPulseStream(); } +void QSoundEffectPrivate::contextFailed() +{ + unloadPulseStream(); + connect(pulseDaemon(), SIGNAL(contextReady()), this, SLOT(contextReady())); +} + void QSoundEffectPrivate::stream_write_callback(pa_stream *s, size_t length, void *userdata) { Q_UNUSED(length); diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.h b/src/multimedia/audio/qsoundeffect_pulse_p.h index e43bd2fd..4dc58f0b 100644 --- a/src/multimedia/audio/qsoundeffect_pulse_p.h +++ b/src/multimedia/audio/qsoundeffect_pulse_p.h @@ -111,6 +111,7 @@ private Q_SLOTS: void sampleReady(); void uploadSample(); void contextReady(); + void contextFailed(); void underRun(); void prepare(); void streamReady(); diff --git a/src/multimediawidgets/doc/src/qtmultimediawidgets-index.qdoc b/src/multimediawidgets/doc/src/qtmultimediawidgets-index.qdoc index 07fa6320..e722f4cb 100644 --- a/src/multimediawidgets/doc/src/qtmultimediawidgets-index.qdoc +++ b/src/multimediawidgets/doc/src/qtmultimediawidgets-index.qdoc @@ -57,7 +57,6 @@ QT += multimediawidgets \section2 Examples \list -\li \l{QML Camera Example} \li \l{Camera Example} \li \l{Media Player Example} \li \l{Video Graphics Item Example}