diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-09-20 14:04:58 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-09-20 14:04:58 +0200 |
commit | ddcf3ad4fe53f03f53114bc378118e3d4020bd9b (patch) | |
tree | c271b7124eac2c6c7d7c7ab888c203e8d98f72d7 | |
parent | 8cf2226b05197a3003328c2cc960830bf4bc5f7a (diff) |
Ringbuffer based audio player.
-rw-r--r-- | src/soundplayer.cc | 65 | ||||
-rw-r--r-- | src/soundplayer.h | 14 |
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__*/ |