fix audio crash and looping
This commit is contained in:
parent
58ea37f8f7
commit
d56a349dc9
|
@ -81,6 +81,7 @@ void AudioOutput::stop()
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
|
||||||
if(m_audioOutput != NULL) {
|
if(m_audioOutput != NULL) {
|
||||||
|
m_audioOutput->stop();
|
||||||
delete m_audioOutput;
|
delete m_audioOutput;
|
||||||
m_audioOutput = NULL;
|
m_audioOutput = NULL;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +120,7 @@ qint64 AudioOutput::readData(char* data, qint64 maxLen)
|
||||||
if(m_mixBuffer.size() != framesPerBuffer * 2)
|
if(m_mixBuffer.size() != framesPerBuffer * 2)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memset(m_mixBuffer.data(), 0x00, framesPerBuffer * sizeof(m_mixBuffer[0])); // start with silence
|
memset(&m_mixBuffer[0], 0x00, 2 * framesPerBuffer * sizeof(m_mixBuffer[0])); // start with silence
|
||||||
|
|
||||||
// sum up a block from all fifos
|
// sum up a block from all fifos
|
||||||
for(AudioFifos::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it) {
|
for(AudioFifos::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it) {
|
||||||
|
@ -141,12 +142,20 @@ qint64 AudioOutput::readData(char* data, qint64 maxLen)
|
||||||
std::vector<qint32>::const_iterator src = m_mixBuffer.begin();
|
std::vector<qint32>::const_iterator src = m_mixBuffer.begin();
|
||||||
qint16* dst = (qint16*)data;
|
qint16* dst = (qint16*)data;
|
||||||
for(int i = 0; i < framesPerBuffer; ++i) {
|
for(int i = 0; i < framesPerBuffer; ++i) {
|
||||||
|
// left channel
|
||||||
qint32 s = *src++;
|
qint32 s = *src++;
|
||||||
if(s < -32768)
|
if(s < -32768)
|
||||||
s = -32768;
|
s = -32768;
|
||||||
else if(s > 32767)
|
else if(s > 32767)
|
||||||
s = 32767;
|
s = 32767;
|
||||||
*dst++ = s;
|
*dst++ = s;
|
||||||
|
// right channel
|
||||||
|
s = *src++;
|
||||||
|
if(s < -32768)
|
||||||
|
s = -32768;
|
||||||
|
else if(s > 32767)
|
||||||
|
s = 32767;
|
||||||
|
*dst++ = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
return maxLen;
|
return maxLen;
|
||||||
|
|
Loading…
Reference in New Issue