diff options
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r-- | apps/pcmbuf.c | 27 |
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. */ |
55 | static size_t pcmbuf_size IDATA_ATTR = 0; | 57 | static size_t pcmbuf_size IDATA_ATTR = 0; |
56 | 58 | static char *pcmbuf_bufend IDATA_ATTR; | |
57 | static char *audiobuffer IDATA_ATTR; | 59 | static char *audiobuffer IDATA_ATTR; |
58 | /* Current audio buffer write index. */ | 60 | /* Current audio buffer write index. */ |
59 | static size_t audiobuffer_pos IDATA_ATTR; | 61 | static size_t audiobuffer_pos IDATA_ATTR; |
@@ -360,7 +362,7 @@ int pcmbuf_used_descs(void) { | |||
360 | } | 362 | } |
361 | 363 | ||
362 | int pcmbuf_descs(void) { | 364 | int pcmbuf_descs(void) { |
363 | return pcmbuf_size / PCMBUF_MINAVG_CHUNK; | 365 | return PCMBUF_DESCS(pcmbuf_size); |
364 | } | 366 | } |
365 | 367 | ||
366 | size_t get_pcmbuf_descsize(void) { | 368 | size_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 | ||
383 | bool 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|... */ |
383 | void pcmbuf_init(size_t bufsize) | 392 | size_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 | ||
398 | size_t pcmbuf_get_bufsize(void) | 409 | size_t pcmbuf_get_bufsize(void) |