diff options
-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]); } |