summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2014-09-20 14:04:58 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2014-09-20 14:04:58 +0200
commitddcf3ad4fe53f03f53114bc378118e3d4020bd9b (patch)
treec271b7124eac2c6c7d7c7ab888c203e8d98f72d7
parent8cf2226b05197a3003328c2cc960830bf4bc5f7a (diff)
Ringbuffer based audio player.
-rw-r--r--src/soundplayer.cc65
-rw-r--r--src/soundplayer.h14
2 files changed, 19 insertions, 60 deletions
diff --git a/src/soundplayer.cc b/src/soundplayer.cc
index 9802d1b..29c50ac 100644
--- a/src/soundplayer.cc
+++ b/src/soundplayer.cc
@@ -33,9 +33,11 @@
#define BUFSZ 512
SoundPlayer::SoundPlayer()
- : sem_write(1)
{
start();
+ pread = 0;
+ pwrite = BUFSZ * 4;
+ memset(ringbuffer, 0, sizeof(ringbuffer));
}
SoundPlayer::~SoundPlayer()
@@ -63,51 +65,15 @@ void SoundPlayer::run()
running = true;
short s[BUFSZ];
+ memset(s, 0, sizeof(s));
while(running) {
- sem_read.acquire();
-
- char *pcm;
- size_t size;
-
- {
- QMutexLocker lock(&mutex);
- pcm = qi.pcm;
- size = qi.size;
+ for(int i = 0; i < BUFSZ; i++) {
+ s[i] = ringbuffer[pread % RINGBUFFER];
+ ringbuffer[pread % RINGBUFFER] = 0;
+ pread++;
}
- sem_write.release();
-
- printf("."); fflush(stdout);
-
- ao_play(dev, pcm, size);
-
- free(pcm);
-
- /*
- memset(s, 0, BUFSZ * sizeof(short));
-
- QList<QueueItem>::iterator it = active.begin();
- while(it != active.end()) {
- QueueItem &item = *it;
-
- for(size_t i = 0; i < BUFSZ; i++) {
- if(item.pos >= item.size) {
- free(item.samples);
- it = active.erase(it);
- goto nextitem;
- }
- s[i] += item.samples[item.pos];
- item.pos++;
- }
-
- it++;
-
- nextitem:
- int a = 1;(void)a;
- }
-
- ao_play(dev, (char*)s, BUFSZ * sizeof(short));
- */
+ ao_play(dev, (char *)s, sizeof(s));
}
ao_close(dev);
@@ -116,14 +82,9 @@ void SoundPlayer::run()
void SoundPlayer::playSamples(const char *pcm, size_t size)
{
- sem_write.acquire();
-
- {
- QMutexLocker lock(&mutex);
- qi.pcm = (char*)malloc(size);
- memcpy(qi.pcm, pcm, size);
- qi.size = size;
+ short *p = (short*)pcm;
+ for(int i = 0; i < size / sizeof(short); i++) {
+ ringbuffer[pwrite % RINGBUFFER] += p[i];
+ pwrite++;
}
-
- sem_read.release();
}
diff --git a/src/soundplayer.h b/src/soundplayer.h
index 9a1e811..33ba248 100644
--- a/src/soundplayer.h
+++ b/src/soundplayer.h
@@ -36,6 +36,9 @@
#include "frame.h"
+// Sixe of reingbuffer in samples (16KHz), delay will be half that value
+#define RINGBUFFER 16000
+
class QueueItem {
public:
char *pcm;
@@ -53,14 +56,9 @@ public:
private:
volatile bool running;
- QMutex mutex;
- QSemaphore sem_read;
- QSemaphore sem_write;
-
- QueueItem qi;
-
- QList<QueueItem> queue;
- QList<QueueItem> active;
+ short ringbuffer[RINGBUFFER];
+ int pwrite;
+ int pread;
};
#endif/*__KAIMAN_SOUNDPLAYER_H__*/