summaryrefslogtreecommitdiff
path: root/apps/pcmbuf.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2006-11-06 18:07:30 +0000
committerMichael Sevakis <jethead71@rockbox.org>2006-11-06 18:07:30 +0000
commit0f5cb94aa4a334366a746fcbb22f3335ca413265 (patch)
tree8f89a96628c1810d51ee9816daf78edb8c76fcd4 /apps/pcmbuf.c
parent0b22795e26ee09de14f6ac23219adeda12f2fd5b (diff)
downloadrockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.tar.gz
rockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.zip
Big Patch adds primarily: Samplerate and format selection to recording for SWCODEC. Supprort for samplerates changing in playback (just goes with the recording part inseparably). Samplerates to all encoders. Encoders can be configured individually on a menu specific to the encoder in the recording menu. File creation is delayed until flush time to reduce spinups when splitting. Misc: statusbar icons for numbers are individual digits to display any number. Audio buffer was rearranged to maximize memory available to recording and properly reinitialized when trashed. ColdFire PCM stuff moved to target tree to avoid a complicated mess when adding samplerate switching. Some needed API changes and to neaten up growing gap between hardware and software codecs.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11452 a1c6a512-1295-4272-9138-f99709370657
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)