From cfa9d24ead2f960e3ecde3ccc2218383d8833c48 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 24 Sep 2014 19:14:58 +0200 Subject: Resync audio when drifting. --- src/soundplayer.cc | 22 ++++++++++++++++++++-- 1 file 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]); } -- cgit v1.2.3