Mercurial > hg > svapp
changeset 120:2aa263b384f8
* Fix to PulseAudio output -- it works rather better now it's being fed
the right number of samples and not 8 times as many
author | Chris Cannam |
---|---|
date | Fri, 23 May 2008 15:36:20 +0000 |
parents | 1ba557a20ca3 |
children | 087662afe778 |
files | audioio/AudioPulseAudioTarget.cpp audioio/AudioPulseAudioTarget.h |
diffstat | 2 files changed, 37 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/audioio/AudioPulseAudioTarget.cpp Wed May 21 17:17:16 2008 +0000 +++ b/audioio/AudioPulseAudioTarget.cpp Fri May 23 15:36:20 2008 +0000 @@ -24,7 +24,7 @@ #include <cassert> #include <cmath> -#define DEBUG_AUDIO_PULSE_AUDIO_TARGET 1 +//#define DEBUG_AUDIO_PULSE_AUDIO_TARGET 1 AudioPulseAudioTarget::AudioPulseAudioTarget(AudioCallbackPlaySource *source) : AudioCallbackPlayTarget(source), @@ -149,10 +149,10 @@ } void -AudioPulseAudioTarget::streamWrite(size_t nframes) +AudioPulseAudioTarget::streamWrite(size_t requested) { #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET - std::cout << "AudioPulseAudioTarget::streamWrite(" << nframes << ")" << std::endl; + std::cout << "AudioPulseAudioTarget::streamWrite(" << requested << ")" << std::endl; #endif if (m_done) return; @@ -171,10 +171,6 @@ m_source->setTargetPlayLatency(latframes); //!!! buh } - if (nframes > m_bufferSize) { - std::cerr << "WARNING: AudioPulseAudioTarget::streamWrite: nframes " << nframes << " > m_bufferSize " << m_bufferSize << std::endl; - } - static float *output = 0; static float **tmpbuf = 0; static size_t tmpbufch = 0; @@ -185,6 +181,16 @@ // Because we offer pan, we always want at least 2 channels if (sourceChannels < 2) sourceChannels = 2; + size_t nframes = requested / (sourceChannels * sizeof(float)); + + if (nframes > m_bufferSize) { + std::cerr << "WARNING: AudioPulseAudioTarget::streamWrite: nframes " << nframes << " > m_bufferSize " << m_bufferSize << std::endl; + } + +#ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET + std::cout << "AudioPulseAudioTarget::streamWrite: nframes = " << nframes << std::endl; +#endif + if (!tmpbuf || tmpbufch != sourceChannels || int(tmpbufsz) < nframes) { if (tmpbuf) { @@ -211,10 +217,13 @@ size_t received = m_source->getSourceSamples(nframes, tmpbuf); +#ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET std::cerr << "requested " << nframes << ", received " << received << std::endl; + if (received < nframes) { std::cerr << "*** WARNING: Wrong number of frames received" << std::endl; } +#endif float peakLeft = 0.0, peakRight = 0.0; @@ -257,6 +266,11 @@ if (ch > 0 || sourceChannels == 1) peakRight = peak; } +#ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET + std::cerr << "calling pa_stream_write with " + << nframes * tmpbufch * sizeof(float) << " bytes" << std::endl; +#endif + pa_stream_write(m_stream, output, nframes * tmpbufch * sizeof(float), 0, 0, PA_SEEK_RELATIVE); @@ -339,6 +353,8 @@ pa_stream_set_state_callback(m_stream, streamStateChangedStatic, this); pa_stream_set_write_callback(m_stream, streamWriteStatic, this); + pa_stream_set_overflow_callback(m_stream, streamOverflowStatic, this); + pa_stream_set_underflow_callback(m_stream, streamUnderflowStatic, this); if (pa_stream_connect_playback (m_stream, 0, 0, @@ -389,5 +405,17 @@ } } +void +AudioPulseAudioTarget::streamOverflowStatic(pa_stream *, void *) +{ + std::cerr << "AudioPulseAudioTarget::streamOverflowStatic: Overflow!" << std::endl; +} + +void +AudioPulseAudioTarget::streamUnderflowStatic(pa_stream *, void *) +{ + std::cerr << "AudioPulseAudioTarget::streamUnderflowStatic: Underflow!" << std::endl; +} + #endif /* HAVE_PULSEAUDIO */
--- a/audioio/AudioPulseAudioTarget.h Wed May 21 17:17:16 2008 +0000 +++ b/audioio/AudioPulseAudioTarget.h Fri May 23 15:36:20 2008 +0000 @@ -52,6 +52,8 @@ static void streamWriteStatic(pa_stream *, size_t, void *); static void streamStateChangedStatic(pa_stream *, void *); + static void streamOverflowStatic(pa_stream *, void *); + static void streamUnderflowStatic(pa_stream *, void *); static void contextStateChangedStatic(pa_context *, void *); QMutex m_mutex;