summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audiobackend-pulse.cc33
-rw-r--r--src/audiobackend-pulse.h11
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 <QThread>
#include <pulse/simple.h>
-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*/