summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Daniel <cd@maintech.de>2013-08-07 17:08:54 +0200
committerChristian Daniel <cd@maintech.de>2013-08-07 17:08:54 +0200
commitd56a349dc90a96c2a2418dc68b30173381ca0027 (patch)
tree9306f52f8dd8588e5ad56e4dc60091f82180a4f2
parent58ea37f8f72671fdbb819f563b10886a916bffe0 (diff)
fix audio crash and looping
-rw-r--r--sdrbase/audio/audiooutput.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp
index 247111b..2bd6b93 100644
--- a/sdrbase/audio/audiooutput.cpp
+++ b/sdrbase/audio/audiooutput.cpp
@@ -81,6 +81,7 @@ void AudioOutput::stop()
QMutexLocker mutexLocker(&m_mutex);
if(m_audioOutput != NULL) {
+ m_audioOutput->stop();
delete m_audioOutput;
m_audioOutput = NULL;
}
@@ -119,7 +120,7 @@ qint64 AudioOutput::readData(char* data, qint64 maxLen)
if(m_mixBuffer.size() != framesPerBuffer * 2)
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
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();
qint16* dst = (qint16*)data;
for(int i = 0; i < framesPerBuffer; ++i) {
+ // left channel
qint32 s = *src++;
if(s < -32768)
s = -32768;
else if(s > 32767)
s = 32767;
*dst++ = s;
+ // right channel
+ s = *src++;
+ if(s < -32768)
+ s = -32768;
+ else if(s > 32767)
+ s = 32767;
+ *dst++ = s;
}
return maxLen;