summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2014-09-24 19:14:58 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2014-09-24 19:14:58 +0200
commitcfa9d24ead2f960e3ecde3ccc2218383d8833c48 (patch)
tree8a745616f227f6319f5c7a618df7c86a6170c9e7
parent5f2c2949032ac845c21d2de0ec6eb1c67c94c4f4 (diff)
Resync audio when drifting.
-rw-r--r--src/soundplayer.cc22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/soundplayer.cc b/src/soundplayer.cc
index aa05358..b6d14c1 100644
--- a/src/soundplayer.cc
+++ b/src/soundplayer.cc
@@ -29,13 +29,13 @@
#include "audiobackend.h"
-#define BUFSZ 512
+#define BUFSZ 128
SoundPlayer::SoundPlayer()
{
start();
pread = 0;
- for(int i = 0; i < 10; i++) pwrite[i] = BUFSZ * 4;
+ for(int i = 0; i < 10; i++) pwrite[i] = 0;
memset(ringbuffer, 0, sizeof(ringbuffer));
}
@@ -64,9 +64,27 @@ void SoundPlayer::run()
void SoundPlayer::playSamples(int peer, const char *pcm, size_t size)
{
+ if(pwrite[peer] == 0) pwrite[peer] = pread + (1.5 * BUFSZ);
+
short *p = (short*)pcm;
for(int i = 0; i < size / sizeof(short); i++) {
ringbuffer[pwrite[peer] % RINGBUFFER] += p[i];
pwrite[peer]++;
}
+
+ // If pwrite is behind, repeat the last sample.
+ if((pwrite[peer] - pread) < BUFSZ) {
+ ringbuffer[pwrite[peer] % RINGBUFFER] =
+ ringbuffer[(pwrite[peer] - 1) % RINGBUFFER];
+ pwrite[peer]++;
+ // printf("repeat\n");
+ }
+
+ // If pwrite is too far ahead skip the last sample.
+ if((pwrite[peer] - pread) > (2 * BUFSZ)) {
+ pwrite[peer]--;
+ // printf("skip\n");
+ }
+
+ // printf("pread: %d, pwrite[%d]: %d\n", pread, peer, pwrite[peer]);
}