summaryrefslogtreecommitdiff
path: root/firmware/pcm_playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r--firmware/pcm_playback.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 980f077b5e..0d9af14f2c 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -30,6 +30,8 @@
30#include "wm8975.h" 30#include "wm8975.h"
31#elif defined(HAVE_TLV320) 31#elif defined(HAVE_TLV320)
32#include "tlv320.h" 32#include "tlv320.h"
33#elif defined(HAVE_WM8731L)
34#include "wm8731l.h"
33#endif 35#endif
34#include "system.h" 36#include "system.h"
35#endif 37#endif
@@ -451,6 +453,145 @@ long pcm_get_bytes_waiting(void)
451 return size; 453 return size;
452} 454}
453 455
456#elif defined(HAVE_WM8731L)
457
458/* We need to unify this code with the uda1380 code as much as possible, but
459 we will keep it separate during early development.
460*/
461
462static bool pcm_playing;
463static bool pcm_paused;
464static int pcm_freq = 0x6; /* 44.1 is default */
465
466static unsigned char *next_start;
467static long next_size;
468
469/* Set up the DMA transfer that kicks in when the audio FIFO gets empty */
470static void dma_start(const void *addr, long size)
471{
472 pcm_playing = true;
473
474 addr = (void *)((unsigned long)addr & ~3); /* Align data */
475 size &= ~3; /* Size must be multiple of 4 */
476
477 /* Disable playback for now */
478 pcm_playing = false;
479 return;
480
481/* This is the uda1380 code */
482#if 0
483 /* Reset the audio FIFO */
484
485 /* Set up DMA transfer */
486 SAR0 = ((unsigned long)addr); /* Source address */
487 DAR0 = (unsigned long)&PDOR3; /* Destination address */
488 BCR0 = size; /* Bytes to transfer */
489
490 /* Enable the FIFO and force one write to it */
491 IIS2CONFIG = IIS_DEFPARM(pcm_freq);
492
493 DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START;
494#endif
495}
496
497/* Stops the DMA transfer and interrupt */
498static void dma_stop(void)
499{
500 pcm_playing = false;
501
502#if 0
503/* This is the uda1380 code */
504 DCR0 = 0;
505 DSR0 = 1;
506 /* Reset the FIFO */
507 IIS2CONFIG = IIS_RESET | IIS_DEFPARM(pcm_freq);
508#endif
509 next_start = NULL;
510 next_size = 0;
511 pcm_paused = false;
512}
513
514
515void pcm_init(void)
516{
517 pcm_playing = false;
518 pcm_paused = false;
519
520 /* Initialize default register values. */
521 wm8731l_init();
522
523 /* The uda1380 needs a sleep(HZ) here - do we need one? */
524
525 /* Power on */
526 wm8731l_enable_output(true);
527
528 /* Unmute the master channel (DAC should be at zero point now). */
529 wm8731l_mute(false);
530
531 /* Call dma_stop to initialize everything. */
532 dma_stop();
533}
534
535void pcm_set_frequency(unsigned int frequency)
536{
537 (void)frequency;
538 pcm_freq=frequency;
539}
540
541/* the registered callback function to ask for more mp3 data */
542static void (*callback_for_more)(unsigned char**, long*) = NULL;
543
544void pcm_play_data(void (*get_more)(unsigned char** start, long* size))
545{
546 unsigned char *start;
547 long size;
548
549 callback_for_more = get_more;
550
551 get_more((unsigned char **)&start, (long *)&size);
552 get_more(&next_start, &next_size);
553
554 dma_start(start, size);
555}
556
557void pcm_play_stop(void)
558{
559 if (pcm_playing) {
560 dma_stop();
561 }
562}
563
564void pcm_play_pause(bool play)
565{
566 if(pcm_paused && play && next_size)
567 {
568 logf("unpause");
569 /* We need to enable DMA here */
570 }
571 else if(!pcm_paused && !play)
572 {
573 logf("pause");
574 /* We need to disable DMA here */
575 }
576 pcm_paused = !play;
577}
578
579bool pcm_is_paused(void)
580{
581 return pcm_paused;
582}
583
584bool pcm_is_playing(void)
585{
586 return pcm_playing;
587}
588
589
590long pcm_get_bytes_waiting(void)
591{
592 return 0;
593}
594
454#elif CONFIG_CPU == PNX0101 595#elif CONFIG_CPU == PNX0101
455 596
456/* TODO: Implement for iFP7xx 597/* TODO: Implement for iFP7xx
@@ -530,6 +671,9 @@ void pcm_calculate_peaks(int *left, int *right)
530#elif defined(HAVE_WM8975) 671#elif defined(HAVE_WM8975)
531 long samples = size / 4; 672 long samples = size / 4;
532 short *addr = p; 673 short *addr = p;
674#elif defined(HAVE_WM8731L)
675 long samples = next_size / 4;
676 short *addr = (short *)next_start;
533#elif defined(HAVE_TLV320) 677#elif defined(HAVE_TLV320)
534 long samples = 4; /* TODO X5 */ 678 long samples = 4; /* TODO X5 */
535 short *addr = NULL; 679 short *addr = NULL;