summaryrefslogtreecommitdiff
path: root/firmware/pcm_playback.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2005-12-16 11:00:44 +0000
committerDave Chapman <dave@dchapman.com>2005-12-16 11:00:44 +0000
commita472ed5114421c0a988e79e03c158c5ac3485b41 (patch)
treebe31f3194e39bc6e4fb322f6dc6f27f3d5bd6c55 /firmware/pcm_playback.c
parentd22938286efa29139df27257a15c619450bf3c13 (diff)
iPod - Initial skeleton of an audio driver
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8248 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r--firmware/pcm_playback.c111
1 files changed, 101 insertions, 10 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 6703c6a622..8a6de9a8b9 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -26,6 +26,8 @@
#include "i2c.h"
#if defined(HAVE_UDA1380)
#include "uda1380.h"
+#elif defined(HAVE_WM8975)
+#include "wm8975.h"
#elif defined(HAVE_TLV320)
#include "tlv320.h"
#endif
@@ -343,50 +345,139 @@ void pcm_init(void)
#elif defined(HAVE_WM8975)
-/* TODO: Implement for iPod - we should probably move the UDA1380 and
- WM8975 specific code into separate files.
-
- For now, just implement some dummy functions.
+/* We need to unify this code with the uda1380 code as much as possible, but
+ we will keep it separate during early development.
*/
+static bool pcm_playing;
+static bool pcm_paused;
+static int pcm_freq = 0x6; /* 44.1 is default */
+
+static unsigned char *next_start;
+static long next_size;
+
+/* Set up the DMA transfer that kicks in when the audio FIFO gets empty */
+static void dma_start(const void *addr, long size)
+{
+ pcm_playing = true;
+
+ addr = (void *)((unsigned long)addr & ~3); /* Align data */
+ size &= ~3; /* Size must be multiple of 4 */
+
+ return;
+
+/* This is the uda1380 code */
+#if 0
+ /* Reset the audio FIFO */
+
+ /* Set up DMA transfer */
+ SAR0 = ((unsigned long)addr); /* Source address */
+ DAR0 = (unsigned long)&PDOR3; /* Destination address */
+ BCR0 = size; /* Bytes to transfer */
+
+ /* Enable the FIFO and force one write to it */
+ IIS2CONFIG = IIS_DEFPARM(pcm_freq);
+
+ DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START;
+#endif
+}
+
+/* Stops the DMA transfer and interrupt */
+static void dma_stop(void)
+{
+ pcm_playing = false;
+
+#if 0
+/* This is the uda1380 code */
+ DCR0 = 0;
+ DSR0 = 1;
+ /* Reset the FIFO */
+ IIS2CONFIG = IIS_RESET | IIS_DEFPARM(pcm_freq);
+#endif
+ next_start = NULL;
+ next_size = 0;
+ pcm_paused = false;
+}
+
+
void pcm_init(void)
{
+ pcm_playing = false;
+ pcm_paused = false;
+
+ /* Initialize default register values. */
+ wm8975_init();
+
+ /* The uda1380 needs a sleep(HZ) here - do we need one? */
+ /* Power on */
+ wm8975_enable_output(true);
+
+ /* Unmute the master channel (DAC should be at zero point now). */
+ wm8975_mute(false);
+
+ /* Call dma_stop to initialize everything. */
+ dma_stop();
}
void pcm_set_frequency(unsigned int frequency)
{
(void)frequency;
+ pcm_freq=frequency;
}
+/* the registered callback function to ask for more mp3 data */
+static void (*callback_for_more)(unsigned char**, long*) = NULL;
+
void pcm_play_data(void (*get_more)(unsigned char** start, long* size))
{
- (void)get_more;
+ unsigned char *start;
+ long size;
+
+ callback_for_more = get_more;
+
+ get_more((unsigned char **)&start, (long *)&size);
+ get_more(&next_start, &next_size);
+
+ dma_start(start, size);
}
void pcm_play_stop(void)
{
+ if (pcm_playing) {
+ dma_stop();
+ }
}
void pcm_play_pause(bool play)
{
- (void)play;
+ if(pcm_paused && play && next_size)
+ {
+ logf("unpause");
+ /* We need to enable DMA here */
+ }
+ else if(!pcm_paused && !play)
+ {
+ logf("pause");
+ /* We need to disable DMA here */
+ }
+ pcm_paused = !play;
}
bool pcm_is_paused(void)
{
- return false;
+ return pcm_paused;
}
bool pcm_is_playing(void)
{
- return false;
+ return pcm_playing;
}
void pcm_calculate_peaks(int *left, int *right)
{
- (void)left;
- (void)right;
+ *left=0;
+ *right=0;
}
long pcm_get_bytes_waiting(void)