From ddcf3ad4fe53f03f53114bc378118e3d4020bd9b Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 20 Sep 2014 14:04:58 +0200 Subject: Ringbuffer based audio player. --- src/soundplayer.cc | 65 +++++++++++------------------------------------------- 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::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 queue; - QList active; + short ringbuffer[RINGBUFFER]; + int pwrite; + int pread; }; #endif/*__KAIMAN_SOUNDPLAYER_H__*/ -- cgit v1.2.3