From ac1ad643ee592ee7ca847e9eb2cc692d91c90a82 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 1 Oct 2014 19:38:10 +0200 Subject: Threaded read. --- src/audiobackend-pulse.cc | 33 +++++++++++++++++++++++++++------ src/audiobackend-pulse.h | 11 ++++++++++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/audiobackend-pulse.cc b/src/audiobackend-pulse.cc index 9f84ebe..3b39d22 100644 --- a/src/audiobackend-pulse.cc +++ b/src/audiobackend-pulse.cc @@ -51,16 +51,24 @@ AudioBackendPulse::AudioBackendPulse(const char *device) { sIn = NULL; sOut = NULL; + + memset(read_buffer, 0, sizeof(read_buffer)); + + running = true; + start(); } AudioBackendPulse::~AudioBackendPulse() { + running = false; + wait(); + // Freeeeedoooooom! Set the PulseAudio instances free again, we're done if(sIn) pa_simple_free(sIn); if(sOut) pa_simple_free(sOut); } -int AudioBackendPulse::read(char *pcm, size_t maxsize) +void AudioBackendPulse::run() { if(!sIn) { sIn = pa_simple_new(NULL, "Anything", PA_STREAM_RECORD, NULL, "record", @@ -71,12 +79,25 @@ int AudioBackendPulse::read(char *pcm, size_t maxsize) return 0; } } - - int error; - if (pa_simple_read(sIn, pcm, maxsize, &error) < 0) { - fprintf(stderr, __FILE__": pa_simple_read() failed: %s\n", - pa_strerror(error)); + + char buf[1024]; + while(running) { + int error; + pa_simple_read(sIn, buf, sizeof(buf), &error); + (void)error; + for(int i = 0; i < sizeof(buf); i++) { + read_buffer[pwrite % sizeof(read_buffer)] = buf[i]; + pwrite++; + } } +} + +int AudioBackendPulse::read(char *pcm, size_t maxsize) +{ + for(int i = 0; i < maxsize; i++) { + pcm[i] = read_buffer[pread % sizeof(read_buffer)]; + pread++; + } return maxsize; } diff --git a/src/audiobackend-pulse.h b/src/audiobackend-pulse.h index 4c696ae..36f2eb8 100644 --- a/src/audiobackend-pulse.h +++ b/src/audiobackend-pulse.h @@ -30,10 +30,11 @@ #ifdef WITH_PULSE #include "audiobackend.h" +#include #include -class AudioBackendPulse : public AudioBackend { +class AudioBackendPulse : public AudioBackend, public QThread { public: AudioBackendPulse(const char *device); ~AudioBackendPulse(); @@ -41,9 +42,17 @@ public: int read(char *pcm, size_t maxsize); int write(const char *pcm, size_t size); + void run(); + private: pa_simple *sIn; pa_simple *sOut; + + volatile bool running; + + char read_buffer[4096]; + int pread; + int pwrite; }; #endif/*WITH_PULSE*/ -- cgit v1.2.3