summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/imports/multimedia/qdeclarativeplaylist.cpp14
-rw-r--r--src/multimedia/playback/qmediaplaylist.cpp6
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp2
-rw-r--r--src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp2
-rw-r--r--src/plugins/wasapi/qwasapiaudioinput.cpp121
-rw-r--r--src/plugins/wasapi/qwasapiaudioinput.h3
-rw-r--r--src/plugins/wasapi/qwasapiaudiooutput.cpp86
-rw-r--r--src/plugins/wasapi/qwasapiaudiooutput.h3
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;
};