diff options
Diffstat (limited to 'src/soundplayer.cc')
-rw-r--r-- | src/soundplayer.cc | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/src/soundplayer.cc b/src/soundplayer.cc index b6d14c1..0ae978f 100644 --- a/src/soundplayer.cc +++ b/src/soundplayer.cc @@ -29,14 +29,13 @@ #include "audiobackend.h" -#define BUFSZ 128 - SoundPlayer::SoundPlayer() { start(); pread = 0; for(int i = 0; i < 10; i++) pwrite[i] = 0; memset(ringbuffer, 0, sizeof(ringbuffer)); + buffer_size = g_audiobackend->getBufferSize(); } SoundPlayer::~SoundPlayer() @@ -49,42 +48,39 @@ void SoundPlayer::run() { running = true; - short s[BUFSZ]; + short *s = (short*)malloc(buffer_size * sizeof(short)); memset(s, 0, sizeof(s)); while(running) { - for(int i = 0; i < BUFSZ; i++) { + for(int i = 0; i < buffer_size; i++) { s[i] = ringbuffer[pread % RINGBUFFER]; ringbuffer[pread % RINGBUFFER] = 0; pread++; } - g_audiobackend->write((const char *)s, sizeof(s)); + g_audiobackend->write((const char *)s, buffer_size * sizeof(short)); } + + free(s); } void SoundPlayer::playSamples(int peer, const char *pcm, size_t size) { - if(pwrite[peer] == 0) pwrite[peer] = pread + (1.5 * BUFSZ); + // printf("%d\t%d\t(diff: %d)\n", pwrite[peer], pread, pwrite[peer] - pread); - short *p = (short*)pcm; - for(int i = 0; i < size / sizeof(short); i++) { - ringbuffer[pwrite[peer] % RINGBUFFER] += p[i]; - pwrite[peer]++; + if(pwrite[peer] < pread) { + pwrite[peer] = pread + (1.5 * buffer_size); + // printf(">>\n"); } - // 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[peer] > (pread + 6 * buffer_size)) { + pwrite[peer] = pread + (1.5 * buffer_size); + // printf("<<\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]); + short *p = (short*)pcm; + for(int i = 0; i < size / sizeof(short); i++) { + ringbuffer[pwrite[peer] % RINGBUFFER] += p[i]; + pwrite[peer]++; + } } |