summaryrefslogtreecommitdiff
path: root/src/soundplayer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/soundplayer.cc')
-rw-r--r--src/soundplayer.cc40
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]++;
+ }
}