diff options
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r-- | firmware/pcm_playback.c | 144 |
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 | |||
462 | static bool pcm_playing; | ||
463 | static bool pcm_paused; | ||
464 | static int pcm_freq = 0x6; /* 44.1 is default */ | ||
465 | |||
466 | static unsigned char *next_start; | ||
467 | static long next_size; | ||
468 | |||
469 | /* Set up the DMA transfer that kicks in when the audio FIFO gets empty */ | ||
470 | static 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 */ | ||
498 | static 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 | |||
515 | void 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 | |||
535 | void 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 */ | ||
542 | static void (*callback_for_more)(unsigned char**, long*) = NULL; | ||
543 | |||
544 | void 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 | |||
557 | void pcm_play_stop(void) | ||
558 | { | ||
559 | if (pcm_playing) { | ||
560 | dma_stop(); | ||
561 | } | ||
562 | } | ||
563 | |||
564 | void 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 | |||
579 | bool pcm_is_paused(void) | ||
580 | { | ||
581 | return pcm_paused; | ||
582 | } | ||
583 | |||
584 | bool pcm_is_playing(void) | ||
585 | { | ||
586 | return pcm_playing; | ||
587 | } | ||
588 | |||
589 | |||
590 | long 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; |