summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2014-10-02 07:21:47 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2014-10-02 07:21:47 +0200
commiteb429ea24a415f25d9a9227b75e1a2c30c02cd70 (patch)
treed15493374e2fc91a5c5ab0b6c7baffbe9d22f709
parentac1ad643ee592ee7ca847e9eb2cc692d91c90a82 (diff)
Pulse audio read ring buffer overflow fix.
-rw-r--r--src/audiobackend-pulse.cc8
-rw-r--r--src/audiobackend-pulse.h4
2 files changed, 10 insertions, 2 deletions
diff --git a/src/audiobackend-pulse.cc b/src/audiobackend-pulse.cc
index 3b39d22..226ab35 100644
--- a/src/audiobackend-pulse.cc
+++ b/src/audiobackend-pulse.cc
@@ -54,6 +54,9 @@ AudioBackendPulse::AudioBackendPulse(const char *device)
memset(read_buffer, 0, sizeof(read_buffer));
+ pread = 0;
+ pwrite = 0;
+
running = true;
start();
}
@@ -94,6 +97,11 @@ void AudioBackendPulse::run()
int AudioBackendPulse::read(char *pcm, size_t maxsize)
{
+ // Wait until enough audio data has been read by the thread.
+ while((pread + maxsize) < pwrite) {
+ usleep(1000);
+ }
+
for(int i = 0; i < maxsize; i++) {
pcm[i] = read_buffer[pread % sizeof(read_buffer)];
pread++;
diff --git a/src/audiobackend-pulse.h b/src/audiobackend-pulse.h
index 36f2eb8..b375a4f 100644
--- a/src/audiobackend-pulse.h
+++ b/src/audiobackend-pulse.h
@@ -51,8 +51,8 @@ private:
volatile bool running;
char read_buffer[4096];
- int pread;
- int pwrite;
+ volatile unsigned int pread;
+ volatile unsigned int pwrite;
};
#endif/*WITH_PULSE*/