Source

Target

Commits (3)
Showing with 41 additions and 16 deletions
...@@ -70,7 +70,6 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device) ...@@ -70,7 +70,6 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device)
, m_errorState(QAudio::NoError) , m_errorState(QAudio::NoError)
, m_deviceState(QAudio::StoppedState) , m_deviceState(QAudio::StoppedState)
, m_lastNotifyTime(0) , m_lastNotifyTime(0)
, m_volume(1)
, m_bufferSize(0) , m_bufferSize(0)
, m_periodSize(0) , m_periodSize(0)
, m_intervalTime(1000) , m_intervalTime(1000)
...@@ -480,12 +479,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const ...@@ -480,12 +479,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const
void QOpenSLESAudioInput::setVolume(qreal vol) void QOpenSLESAudioInput::setVolume(qreal vol)
{ {
// Volume interface is not available for the recorder on Android // Volume interface is not available for the recorder on Android
m_volume = vol; Q_UNUSED(vol);
} }
qreal QOpenSLESAudioInput::volume() const qreal QOpenSLESAudioInput::volume() const
{ {
return m_volume; return qreal(1.0);
} }
void QOpenSLESAudioInput::reset() void QOpenSLESAudioInput::reset()
......
...@@ -113,7 +113,6 @@ private: ...@@ -113,7 +113,6 @@ private:
QAudio::State m_deviceState; QAudio::State m_deviceState;
QTime m_clockStamp; QTime m_clockStamp;
qint64 m_lastNotifyTime; qint64 m_lastNotifyTime;
qreal m_volume;
int m_bufferSize; int m_bufferSize;
int m_periodSize; int m_periodSize;
int m_intervalTime; int m_intervalTime;
......
...@@ -157,7 +157,7 @@ int QOpenSLESAudioOutput::bytesFree() const ...@@ -157,7 +157,7 @@ int QOpenSLESAudioOutput::bytesFree() const
if (m_state != QAudio::ActiveState && m_state != QAudio::IdleState) if (m_state != QAudio::ActiveState && m_state != QAudio::IdleState)
return 0; return 0;
return m_availableBuffers.load() ? m_bufferSize : 0; return m_availableBuffers.loadAcquire() ? m_bufferSize : 0;
} }
int QOpenSLESAudioOutput::periodSize() const int QOpenSLESAudioOutput::periodSize() const
...@@ -343,6 +343,11 @@ void QOpenSLESAudioOutput::onEOSEvent() ...@@ -343,6 +343,11 @@ void QOpenSLESAudioOutput::onEOSEvent()
setError(QAudio::UnderrunError); setError(QAudio::UnderrunError);
} }
void QOpenSLESAudioOutput::onBytesProcessed(qint64 bytes)
{
m_processedBytes += bytes;
}
void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex)
{ {
Q_UNUSED(count); Q_UNUSED(count);
...@@ -351,11 +356,13 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) ...@@ -351,11 +356,13 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex)
if (m_state == QAudio::StoppedState) if (m_state == QAudio::StoppedState)
return; return;
if (!m_pullMode) { if (!m_pullMode) { // We're in push mode.
m_availableBuffers.fetchAndAddRelaxed(1); // Signal that there is a new open slot in the buffer and return
m_availableBuffers.fetchAndAddRelease(1);
return; return;
} }
// We're in pull mode.
const int index = m_nextBuffer * m_bufferSize; const int index = m_nextBuffer * m_bufferSize;
const qint64 readSize = m_audioSource->read(m_buffers + index, m_bufferSize); const qint64 readSize = m_audioSource->read(m_buffers + index, m_bufferSize);
...@@ -370,8 +377,8 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) ...@@ -370,8 +377,8 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex)
return; return;
} }
m_processedBytes += readSize;
m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT; m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT;
QMetaObject::invokeMethod(this, "onBytesProcessed", Qt::QueuedConnection, Q_ARG(qint64, readSize));
} }
void QOpenSLESAudioOutput::playCallback(SLPlayItf player, void *ctx, SLuint32 event) void QOpenSLESAudioOutput::playCallback(SLPlayItf player, void *ctx, SLuint32 event)
...@@ -570,7 +577,7 @@ void QOpenSLESAudioOutput::destroyPlayer() ...@@ -570,7 +577,7 @@ void QOpenSLESAudioOutput::destroyPlayer()
m_buffers = Q_NULLPTR; m_buffers = Q_NULLPTR;
m_processedBytes = 0; m_processedBytes = 0;
m_nextBuffer = 0; m_nextBuffer = 0;
m_availableBuffers = BUFFER_COUNT; m_availableBuffers.storeRelease(BUFFER_COUNT);
m_playItf = Q_NULLPTR; m_playItf = Q_NULLPTR;
m_volumeItf = Q_NULLPTR; m_volumeItf = Q_NULLPTR;
m_bufferQueueItf = Q_NULLPTR; m_bufferQueueItf = Q_NULLPTR;
...@@ -599,20 +606,32 @@ void QOpenSLESAudioOutput::startPlayer() ...@@ -599,20 +606,32 @@ void QOpenSLESAudioOutput::startPlayer()
qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len) qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len)
{ {
if (!len || !m_availableBuffers.load()) if (!len)
return 0; return 0;
if (len > m_bufferSize) if (len > m_bufferSize)
len = m_bufferSize; len = m_bufferSize;
// Acquire one slot in the buffer
const int before = m_availableBuffers.fetchAndAddAcquire(-1);
// If there where no vacant slots, then we just overdrew the buffer account...
if (before < 1) {
m_availableBuffers.fetchAndAddRelease(1);
return 0;
}
const int index = m_nextBuffer * m_bufferSize; const int index = m_nextBuffer * m_bufferSize;
::memcpy(m_buffers + index, data, len); ::memcpy(m_buffers + index, data, len);
const SLuint32 res = (*m_bufferQueueItf)->Enqueue(m_bufferQueueItf, const SLuint32 res = (*m_bufferQueueItf)->Enqueue(m_bufferQueueItf,
m_buffers + index, m_buffers + index,
len); len);
if (res == SL_RESULT_BUFFER_INSUFFICIENT) // If we where unable to enqueue a new buffer, give back the acquired slot.
if (res == SL_RESULT_BUFFER_INSUFFICIENT) {
m_availableBuffers.fetchAndAddRelease(1);
return 0; return 0;
}
if (res != SL_RESULT_SUCCESS) { if (res != SL_RESULT_SUCCESS) {
setError(QAudio::FatalError); setError(QAudio::FatalError);
...@@ -621,7 +640,6 @@ qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len) ...@@ -621,7 +640,6 @@ qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len)
} }
m_processedBytes += len; m_processedBytes += len;
m_availableBuffers.fetchAndAddRelaxed(-1);
setState(QAudio::ActiveState); setState(QAudio::ActiveState);
setError(QAudio::NoError); setError(QAudio::NoError);
m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT; m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT;
......
...@@ -79,6 +79,7 @@ private: ...@@ -79,6 +79,7 @@ private:
friend class SLIODevicePrivate; friend class SLIODevicePrivate;
Q_INVOKABLE void onEOSEvent(); Q_INVOKABLE void onEOSEvent();
Q_INVOKABLE void onBytesProcessed(qint64 bytes);
void bufferAvailable(quint32 count, quint32 playIndex); void bufferAvailable(quint32 count, quint32 playIndex);
static void playCallback(SLPlayItf playItf, void *ctx, SLuint32 event); static void playCallback(SLPlayItf playItf, void *ctx, SLuint32 event);
......
...@@ -184,8 +184,12 @@ D3DPresentEngine::~D3DPresentEngine() ...@@ -184,8 +184,12 @@ D3DPresentEngine::~D3DPresentEngine()
m_egl->destroySurface(m_eglDisplay, m_eglSurface); m_egl->destroySurface(m_eglDisplay, m_eglSurface);
m_eglSurface = NULL; m_eglSurface = NULL;
} }
if (m_glTexture) if (m_glTexture) {
QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_glTexture); if (QOpenGLContext *current = QOpenGLContext::currentContext())
current->functions()->glDeleteTextures(1, &m_glTexture);
else
qWarning() << "D3DPresentEngine: Cannot obtain GL context, unable to delete textures";
}
delete m_glContext; delete m_glContext;
delete m_offscreenSurface; delete m_offscreenSurface;
......
...@@ -227,8 +227,12 @@ QSGVideoMaterial_YUV420::QSGVideoMaterial_YUV420(const QVideoSurfaceFormat &form ...@@ -227,8 +227,12 @@ QSGVideoMaterial_YUV420::QSGVideoMaterial_YUV420(const QVideoSurfaceFormat &form
QSGVideoMaterial_YUV420::~QSGVideoMaterial_YUV420() QSGVideoMaterial_YUV420::~QSGVideoMaterial_YUV420()
{ {
if (!m_textureSize.isEmpty()) if (!m_textureSize.isEmpty()) {
QOpenGLContext::currentContext()->functions()->glDeleteTextures(Num_Texture_IDs, m_textureIds); if (QOpenGLContext *current = QOpenGLContext::currentContext())
current->functions()->glDeleteTextures(Num_Texture_IDs, m_textureIds);
else
qWarning() << "QSGVideoMaterial_YUV420: Cannot obtain GL context, unable to delete textures";
}
} }
void QSGVideoMaterial_YUV420::bind() void QSGVideoMaterial_YUV420::bind()
......