fix audio crash and looping

This commit is contained in:
Christian Daniel 2013-08-07 17:08:54 +02:00
parent 58ea37f8f7
commit d56a349dc9
1 changed files with 10 additions and 1 deletions

View File

@ -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;