diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-09-24 19:14:58 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-09-24 19:14:58 +0200 |
commit | cfa9d24ead2f960e3ecde3ccc2218383d8833c48 (patch) | |
tree | 8a745616f227f6319f5c7a618df7c86a6170c9e7 | |
parent | 5f2c2949032ac845c21d2de0ec6eb1c67c94c4f4 (diff) |
Resync audio when drifting.
-rw-r--r-- | src/soundplayer.cc | 22 |
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]); } |