diff options
author | Liang Qi <liang.qi@qt.io> | 2016-09-19 14:29:40 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-09-19 14:29:47 +0200 |
commit | 01c9322bfe918b886468eb520d77b21b6d8c0c11 (patch) | |
tree | 23362a67d26b7b295a04e8cbacd64ee20393f990 /src | |
parent | 0f47f44d2fc7b3fac7fdd8ee6eeafd767c43ec2e (diff) | |
parent | 256ee311b936d69561e97f7f8ee832cff93cb509 (diff) |
Merge remote-tracking branch 'origin/5.7' into 5.8
Change-Id: I022c07dab3ded6072f7c103e299822caaf40cf34
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/multimedia/qdeclarativeplaylist.cpp | 14 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplaylist.cpp | 6 | ||||
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.cpp | 2 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp | 2 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiaudioinput.cpp | 121 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiaudioinput.h | 3 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiaudiooutput.cpp | 86 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiaudiooutput.h | 3 |
8 files changed, 127 insertions, 110 deletions
diff --git a/src/imports/multimedia/qdeclarativeplaylist.cpp b/src/imports/multimedia/qdeclarativeplaylist.cpp index 0620942bd..b338c33e5 100644 --- a/src/imports/multimedia/qdeclarativeplaylist.cpp +++ b/src/imports/multimedia/qdeclarativeplaylist.cpp @@ -597,7 +597,7 @@ void QDeclarativePlaylist::componentComplete() } /*! - \qmlsignal QtMultimedia::Audio::itemAboutToBeInserted(start, end) + \qmlsignal QtMultimedia::Playlist::itemAboutToBeInserted(start, end) This signal is emitted when items are to be inserted into the playlist at \a start and ending at \a end. @@ -606,7 +606,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::itemInserted(start, end) + \qmlsignal QtMultimedia::Playlist::itemInserted(start, end) This signal is emitted after items have been inserted into the playlist. The new items are those between \a start and \a end inclusive. @@ -615,7 +615,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::itemAboutToBeRemoved(start, end) + \qmlsignal QtMultimedia::Playlist::itemAboutToBeRemoved(start, end) This signal emitted when items are to be deleted from the playlist at \a start and ending at \a end. @@ -624,7 +624,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::itemRemoved(start, end) + \qmlsignal QtMultimedia::Playlist::itemRemoved(start, end) This signal is emitted after items have been removed from the playlist. The removed items are those between \a start and \a end inclusive. @@ -633,7 +633,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::itemChanged(start, end) + \qmlsignal QtMultimedia::Playlist::itemChanged(start, end) This signal is emitted after items have been changed in the playlist between \a start and \a end positions inclusive. @@ -642,7 +642,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::loaded() + \qmlsignal QtMultimedia::Playlist::loaded() This signal is emitted when the playlist loading succeeded. @@ -650,7 +650,7 @@ void QDeclarativePlaylist::componentComplete() */ /*! - \qmlsignal QtMultimedia::Audio::loadFailed() + \qmlsignal QtMultimedia::Playlist::loadFailed() This signal is emitted when the playlist loading failed. \l error and \l errorString can be checked for more information on the failure. diff --git a/src/multimedia/playback/qmediaplaylist.cpp b/src/multimedia/playback/qmediaplaylist.cpp index 4ffcad398..97fe75044 100644 --- a/src/multimedia/playback/qmediaplaylist.cpp +++ b/src/multimedia/playback/qmediaplaylist.cpp @@ -448,10 +448,12 @@ bool QMediaPlaylist::clear() bool QMediaPlaylistPrivate::readItems(QMediaPlaylistReader *reader) { + QList<QMediaContent> items; + while (!reader->atEnd()) - playlist()->addMedia(reader->readItem()); + items.append(reader->readItem()); - return true; + return playlist()->addMedia(items); } bool QMediaPlaylistPrivate::writeItems(QMediaPlaylistWriter *writer) diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index 509057ba1..5587b479c 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -174,6 +174,8 @@ QVideoFrame::PixelFormat pixelFormatFromMediaSubtype(GUID uid) return QVideoFrame::Format_YUYV; else if (uid == MEDIASUBTYPE_NV12) return QVideoFrame::Format_NV12; + else if (uid == MEDIASUBTYPE_MJPG) + return QVideoFrame::Format_Jpeg; else if (uid == MEDIASUBTYPE_IMC1) return QVideoFrame::Format_IMC1; else if (uid == MEDIASUBTYPE_IMC2) diff --git a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp index 0fa618fe4..e1a46841d 100644 --- a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp +++ b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp @@ -54,7 +54,7 @@ QWasapiAudioDeviceInfo::QWasapiAudioDeviceInfo(QByteArray dev, QAudio::Mode mode QAudioFormat referenceFormat = m_interface->m_mixFormat; - const int rates[] = {8000, 11025, 160000, 22050, 32000, 44100, 48000, 88200, 96000, 192000}; + const int rates[] = {8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000}; for (int rate : rates) { QAudioFormat f = referenceFormat; f.setSampleRate(rate); diff --git a/src/plugins/wasapi/qwasapiaudioinput.cpp b/src/plugins/wasapi/qwasapiaudioinput.cpp index 3bcf50367..22a77df38 100644 --- a/src/plugins/wasapi/qwasapiaudioinput.cpp +++ b/src/plugins/wasapi/qwasapiaudioinput.cpp @@ -120,7 +120,7 @@ qint64 WasapiInputDevicePrivate::readData(char* data, qint64 len) qFatal("Could not release buffer"); if (m_input->m_interval && m_input->m_openTime.elapsed() - m_input->m_openTimeOffset > m_input->m_interval) { - QMetaObject::invokeMethod(m_input, "notify", Qt::QueuedConnection); + emit m_input->notify(); m_input->m_openTimeOffset = m_input->m_openTime.elapsed(); } @@ -128,8 +128,7 @@ qint64 WasapiInputDevicePrivate::readData(char* data, qint64 len) if (m_input->m_currentState != QAudio::ActiveState) { m_input->m_currentState = QAudio::ActiveState; - QMetaObject::invokeMethod(m_input, "stateChanged", Qt::QueuedConnection, - Q_ARG(QAudio::State, QAudio::ActiveState)); + emit m_input->stateChanged(m_input->m_currentState); } return readBytes; } @@ -192,13 +191,9 @@ qreal QWasapiAudioInput::volume() const void QWasapiAudioInput::process() { qCDebug(lcMmAudioInput) << __FUNCTION__; - const quint32 channelCount = m_currentFormat.channelCount(); - const quint32 sampleBytes = m_currentFormat.sampleSize() / 8; - BYTE* buffer; - HRESULT hr; DWORD waitRet; - bool processing = true; + m_processing = true; do { waitRet = WaitForSingleObjectEx(m_event, 2000, FALSE); if (waitRet != WAIT_OBJECT_0) { @@ -210,67 +205,75 @@ void QWasapiAudioInput::process() if (m_currentState != QAudio::ActiveState && m_currentState != QAudio::IdleState) break; + QMetaObject::invokeMethod(this, "processBuffer", Qt::QueuedConnection); + } while (m_processing); +} - if (!m_pullMode) { - QMetaObject::invokeMethod(m_eventDevice, "readyRead", Qt::QueuedConnection); - ResetEvent(m_event); - continue; - } +void QWasapiAudioInput::processBuffer() +{ + if (!m_pullMode) { + emit m_eventDevice->readyRead(); + ResetEvent(m_event); + return; + } - quint32 packetFrames; - hr = m_capture->GetNextPacketSize(&packetFrames); + QMutexLocker locker(&m_mutex); + const quint32 channelCount = m_currentFormat.channelCount(); + const quint32 sampleBytes = m_currentFormat.sampleSize() / 8; + BYTE* buffer; + HRESULT hr; - while (packetFrames != 0 && m_currentState == QAudio::ActiveState) { - DWORD flags; - quint64 devicePosition; - hr = m_capture->GetBuffer(&buffer, &packetFrames, &flags, &devicePosition, NULL); - if (hr != S_OK) { - m_currentError = QAudio::FatalError; - QMetaObject::invokeMethod(this, "errorChanged", Qt::QueuedConnection, - Q_ARG(QAudio::Error, QAudio::UnderrunError)); - // Also Error Buffers need to be released - hr = m_capture->ReleaseBuffer(packetFrames); - qCDebug(lcMmAudioInput) << __FUNCTION__ << "Could not acquire input buffer."; - return; - } - const quint32 writeBytes = packetFrames * channelCount * sampleBytes; - if (Q_UNLIKELY(flags & AUDCLNT_BUFFERFLAGS_SILENT)) { - // In case this flag is set, user is supposed to ignore the content - // of the buffer and manually write silence - qCDebug(lcMmAudioInput) << __FUNCTION__ << "AUDCLNT_BUFFERFLAGS_SILENT: " - << "Ignoring buffer and writing silence."; - buffer = new BYTE[writeBytes]; - memset(buffer, 0, writeBytes); - } + quint32 packetFrames; + hr = m_capture->GetNextPacketSize(&packetFrames); + + while (packetFrames != 0 && m_currentState == QAudio::ActiveState) { + DWORD flags; + quint64 devicePosition; + hr = m_capture->GetBuffer(&buffer, &packetFrames, &flags, &devicePosition, NULL); + if (hr != S_OK) { + m_currentError = QAudio::FatalError; + emit errorChanged(m_currentError); + // Also Error Buffers need to be released + hr = m_capture->ReleaseBuffer(packetFrames); + qCDebug(lcMmAudioInput) << __FUNCTION__ << "Could not acquire input buffer."; + return; + } + const quint32 writeBytes = packetFrames * channelCount * sampleBytes; + if (Q_UNLIKELY(flags & AUDCLNT_BUFFERFLAGS_SILENT)) { + // In case this flag is set, user is supposed to ignore the content + // of the buffer and manually write silence + qCDebug(lcMmAudioInput) << __FUNCTION__ << "AUDCLNT_BUFFERFLAGS_SILENT: " + << "Ignoring buffer and writing silence."; + buffer = new BYTE[writeBytes]; + memset(buffer, 0, writeBytes); + } - qint64 written = m_eventDevice->write(reinterpret_cast<const char *>(buffer), writeBytes); + const qint64 written = m_eventDevice->write(reinterpret_cast<const char *>(buffer), writeBytes); - if (Q_UNLIKELY(flags & AUDCLNT_BUFFERFLAGS_SILENT)) - delete [] buffer; + if (Q_UNLIKELY(flags & AUDCLNT_BUFFERFLAGS_SILENT)) + delete [] buffer; - if (written < static_cast<qint64>(writeBytes)) { - if (m_currentError != QAudio::UnderrunError) { - m_currentError = QAudio::UnderrunError; - QMetaObject::invokeMethod(this, "errorChanged", Qt::QueuedConnection, - Q_ARG(QAudio::Error, QAudio::UnderrunError)); - } + if (written < static_cast<qint64>(writeBytes)) { + if (m_currentError != QAudio::UnderrunError) { + m_currentError = QAudio::UnderrunError; + emit errorChanged(m_currentError); } - hr = m_capture->ReleaseBuffer(packetFrames); - if (hr != S_OK) - qFatal("Could not release buffer"); + } + hr = m_capture->ReleaseBuffer(packetFrames); + if (hr != S_OK) + qFatal("Could not release buffer"); - m_bytesProcessed += writeBytes; + m_bytesProcessed += writeBytes; - hr = m_capture->GetNextPacketSize(&packetFrames); - } - ResetEvent(m_event); + hr = m_capture->GetNextPacketSize(&packetFrames); + } + ResetEvent(m_event); - if (m_interval && m_openTime.elapsed() - m_openTimeOffset > m_interval) { - QMetaObject::invokeMethod(this, "notify", Qt::QueuedConnection); - m_openTimeOffset = m_openTime.elapsed(); - } - processing = m_currentState == QAudio::ActiveState || m_currentState == QAudio::IdleState; - } while (processing); + if (m_interval && m_openTime.elapsed() - m_openTimeOffset > m_interval) { + emit notify(); + m_openTimeOffset = m_openTime.elapsed(); + } + m_processing = m_currentState == QAudio::ActiveState || m_currentState == QAudio::IdleState; } bool QWasapiAudioInput::initStart(bool pull) diff --git a/src/plugins/wasapi/qwasapiaudioinput.h b/src/plugins/wasapi/qwasapiaudioinput.h index cb2f46436..3fd7315c1 100644 --- a/src/plugins/wasapi/qwasapiaudioinput.h +++ b/src/plugins/wasapi/qwasapiaudioinput.h @@ -88,6 +88,8 @@ public: qreal volume() const Q_DECL_OVERRIDE; void process(); +public slots: + void processBuffer(); private: bool initStart(bool pull); friend class WasapiInputDevicePrivate; @@ -112,6 +114,7 @@ private: quint32 m_bufferBytes; HANDLE m_event; QWasapiProcessThread *m_eventThread; + QAtomicInt m_processing; QIODevice *m_eventDevice; }; diff --git a/src/plugins/wasapi/qwasapiaudiooutput.cpp b/src/plugins/wasapi/qwasapiaudiooutput.cpp index 53f4f2710..1b0f64451 100644 --- a/src/plugins/wasapi/qwasapiaudiooutput.cpp +++ b/src/plugins/wasapi/qwasapiaudiooutput.cpp @@ -206,13 +206,9 @@ qreal QWasapiAudioOutput::volume() const void QWasapiAudioOutput::process() { qCDebug(lcMmAudioOutput) << __FUNCTION__; - const quint32 channelCount = m_currentFormat.channelCount(); - const quint32 sampleBytes = m_currentFormat.sampleSize() / 8; - BYTE* buffer; - HRESULT hr; DWORD waitRet; - bool processing = true; + m_processing = true; do { waitRet = WaitForSingleObjectEx(m_event, 2000, FALSE); if (waitRet != WAIT_OBJECT_0) { @@ -224,51 +220,59 @@ void QWasapiAudioOutput::process() if (m_currentState != QAudio::ActiveState && m_currentState != QAudio::IdleState) break; + QMetaObject::invokeMethod(this, "processBuffer", Qt::QueuedConnection); + } while (m_processing); +} - quint32 paddingFrames; - hr = m_interface->m_client->GetCurrentPadding(&paddingFrames); +void QWasapiAudioOutput::processBuffer() +{ + QMutexLocker locker(&m_mutex); - quint32 availableFrames = m_bufferFrames - paddingFrames; - hr = m_renderer->GetBuffer(availableFrames, &buffer); - if (hr != S_OK) { - m_currentError = QAudio::UnderrunError; - QMetaObject::invokeMethod(this, "errorChanged", Qt::QueuedConnection, - Q_ARG(QAudio::Error, QAudio::UnderrunError)); - // Also Error Buffers need to be released - hr = m_renderer->ReleaseBuffer(availableFrames, 0); - ResetEvent(m_event); - continue; // We will continue trying - } + const quint32 channelCount = m_currentFormat.channelCount(); + const quint32 sampleBytes = m_currentFormat.sampleSize() / 8; + BYTE* buffer; + HRESULT hr; - const quint32 readBytes = availableFrames * channelCount * sampleBytes; - qint64 read = m_eventDevice->read((char*)buffer, readBytes); - if (read < static_cast<qint64>(readBytes)) { - // Fill the rest of the buffer with zero to avoid audio glitches - if (m_currentError != QAudio::UnderrunError) { - m_currentError = QAudio::UnderrunError; - QMetaObject::invokeMethod(this, "errorChanged", Qt::QueuedConnection, - Q_ARG(QAudio::Error, QAudio::UnderrunError)); - } - if (m_currentState != QAudio::IdleState) { - m_currentState = QAudio::IdleState; - QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, - Q_ARG(QAudio::State, QAudio::IdleState)); - } - } + quint32 paddingFrames; + hr = m_interface->m_client->GetCurrentPadding(&paddingFrames); + const quint32 availableFrames = m_bufferFrames - paddingFrames; + hr = m_renderer->GetBuffer(availableFrames, &buffer); + if (hr != S_OK) { + m_currentError = QAudio::UnderrunError; + emit errorChanged(m_currentError); + // Also Error Buffers need to be released hr = m_renderer->ReleaseBuffer(availableFrames, 0); - if (hr != S_OK) - qFatal("Could not release buffer"); ResetEvent(m_event); + return; + } - if (m_interval && m_openTime.elapsed() - m_openTimeOffset > m_interval) { - QMetaObject::invokeMethod(this, "notify", Qt::QueuedConnection); - m_openTimeOffset = m_openTime.elapsed(); + const quint32 readBytes = availableFrames * channelCount * sampleBytes; + const qint64 read = m_eventDevice->read((char*)buffer, readBytes); + if (read < static_cast<qint64>(readBytes)) { + // Fill the rest of the buffer with zero to avoid audio glitches + if (m_currentError != QAudio::UnderrunError) { + m_currentError = QAudio::UnderrunError; + emit errorChanged(m_currentError); } + if (m_currentState != QAudio::IdleState) { + m_currentState = QAudio::IdleState; + emit stateChanged(m_currentState); + } + } + + hr = m_renderer->ReleaseBuffer(availableFrames, 0); + if (hr != S_OK) + qFatal("Could not release buffer"); + ResetEvent(m_event); + + if (m_interval && m_openTime.elapsed() - m_openTimeOffset > m_interval) { + emit notify(); + m_openTimeOffset = m_openTime.elapsed(); + } - m_bytesProcessed += read; - processing = m_currentState == QAudio::ActiveState || m_currentState == QAudio::IdleState; - } while (processing); + m_bytesProcessed += read; + m_processing = m_currentState == QAudio::ActiveState || m_currentState == QAudio::IdleState; } bool QWasapiAudioOutput::initStart(bool pull) diff --git a/src/plugins/wasapi/qwasapiaudiooutput.h b/src/plugins/wasapi/qwasapiaudiooutput.h index 247a07160..118731af9 100644 --- a/src/plugins/wasapi/qwasapiaudiooutput.h +++ b/src/plugins/wasapi/qwasapiaudiooutput.h @@ -89,6 +89,8 @@ public: qreal volume() const Q_DECL_OVERRIDE; void process(); +public slots: + void processBuffer(); private: bool initStart(bool pull); friend class WasapiOutputDevicePrivate; @@ -113,6 +115,7 @@ private: quint32 m_bufferBytes; HANDLE m_event; QWasapiProcessThread *m_eventThread; + QAtomicInt m_processing; QIODevice *m_eventDevice; }; |