summaryrefslogtreecommitdiff
path: root/src/audiobackend-pulse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audiobackend-pulse.cc')
-rw-r--r--src/audiobackend-pulse.cc33
1 files changed, 27 insertions, 6 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;
}