summaryrefslogtreecommitdiff
path: root/apps/pcmbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r--apps/pcmbuf.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index 44f175c67d..5119d20ebd 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -51,9 +51,11 @@ struct pcmbufdesc
51 void (*callback)(void); 51 void (*callback)(void);
52}; 52};
53 53
54#define PCMBUF_DESCS(bufsize) ((bufsize) / PCMBUF_MINAVG_CHUNK)
55
54/* Size of the PCM buffer. */ 56/* Size of the PCM buffer. */
55static size_t pcmbuf_size IDATA_ATTR = 0; 57static size_t pcmbuf_size IDATA_ATTR = 0;
56 58static char *pcmbuf_bufend IDATA_ATTR;
57static char *audiobuffer IDATA_ATTR; 59static char *audiobuffer IDATA_ATTR;
58/* Current audio buffer write index. */ 60/* Current audio buffer write index. */
59static size_t audiobuffer_pos IDATA_ATTR; 61static size_t audiobuffer_pos IDATA_ATTR;
@@ -360,7 +362,7 @@ int pcmbuf_used_descs(void) {
360} 362}
361 363
362int pcmbuf_descs(void) { 364int pcmbuf_descs(void) {
363 return pcmbuf_size / PCMBUF_MINAVG_CHUNK; 365 return PCMBUF_DESCS(pcmbuf_size);
364} 366}
365 367
366size_t get_pcmbuf_descsize(void) { 368size_t get_pcmbuf_descsize(void) {
@@ -371,28 +373,37 @@ static void pcmbuf_init_pcmbuffers(void) {
371 struct pcmbufdesc *next = pcmbuf_write; 373 struct pcmbufdesc *next = pcmbuf_write;
372 next++; 374 next++;
373 pcmbuf_write_end = pcmbuf_write; 375 pcmbuf_write_end = pcmbuf_write;
374 while ((void *)next < (void *)audiobufend) { 376 while ((void *)next < (void *)pcmbuf_bufend) {
375 pcmbuf_write_end->link=next; 377 pcmbuf_write_end->link=next;
376 pcmbuf_write_end=next; 378 pcmbuf_write_end=next;
377 next++; 379 next++;
378 } 380 }
379} 381}
380 382
383bool pcmbuf_is_same_size(size_t bufsize)
384{
385 /* keep calculations synced with pcmbuf_init */
386 bufsize += PCMBUF_MIX_CHUNK * 2 + PCMBUF_DESCS(bufsize);
387 return bufsize == (size_t)(pcmbuf_bufend - audiobuffer);
388}
389
381/* Initialize the pcmbuffer the structure looks like this: 390/* Initialize the pcmbuffer the structure looks like this:
382 * ...CODECBUFFER|---------PCMBUF---------|GUARDBUF|DESCS| */ 391 * ...|---------PCMBUF---------|FADEBUF|VOICEBUF|DESCS|... */
383void pcmbuf_init(size_t bufsize) 392size_t pcmbuf_init(size_t bufsize, char *bufend)
384{ 393{
385 pcmbuf_size = bufsize; 394 pcmbuf_size = bufsize;
395 pcmbuf_bufend = bufend;
386 pcmbuf_descsize = pcmbuf_descs()*sizeof(struct pcmbufdesc); 396 pcmbuf_descsize = pcmbuf_descs()*sizeof(struct pcmbufdesc);
387 audiobuffer = (char *)&audiobuf[(audiobufend - audiobuf) - 397 audiobuffer = pcmbuf_bufend - (pcmbuf_size + PCMBUF_MIX_CHUNK * 2
388 (pcmbuf_size + PCMBUF_MIX_CHUNK * 2 + pcmbuf_descsize)]; 398 + pcmbuf_descsize);
389 fadebuf = &audiobuffer[pcmbuf_size]; 399 fadebuf = &audiobuffer[pcmbuf_size];
390 voicebuf = &fadebuf[PCMBUF_MIX_CHUNK]; 400 voicebuf = &fadebuf[PCMBUF_MIX_CHUNK];
391 pcmbuf_write = (struct pcmbufdesc *)(&voicebuf[PCMBUF_MIX_CHUNK]); 401 pcmbuf_write = (struct pcmbufdesc *)&voicebuf[PCMBUF_MIX_CHUNK];
392 pcmbuf_init_pcmbuffers(); 402 pcmbuf_init_pcmbuffers();
393 position_callback = NULL; 403 position_callback = NULL;
394 pcmbuf_event_handler = NULL; 404 pcmbuf_event_handler = NULL;
395 pcmbuf_play_stop(); 405 pcmbuf_play_stop();
406 return pcmbuf_bufend - audiobuffer;
396} 407}
397 408
398size_t pcmbuf_get_bufsize(void) 409size_t pcmbuf_get_bufsize(void)