diff options
author | Nils Wallménius <nils@rockbox.org> | 2007-09-11 15:34:54 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2007-09-11 15:34:54 +0000 |
commit | cab33b64a02cc17e9da85695817e6196cec4a345 (patch) | |
tree | dd10cc714ca73478ebe5f32103cd01e384c1240a /firmware/pcm_playback.c | |
parent | c643692201418c631b7ea8b9c68a9595323b1d5a (diff) | |
download | rockbox-cab33b64a02cc17e9da85695817e6196cec4a345.tar.gz rockbox-cab33b64a02cc17e9da85695817e6196cec4a345.zip |
Accept patch in FS#7751 by Catalin Patulea, move ifp port specific pcm code to a new file
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14670 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r-- | firmware/pcm_playback.c | 185 |
1 files changed, 23 insertions, 162 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index d81853e1cb..e6e59ca604 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c @@ -21,9 +21,6 @@ #include "logf.h" #include "audio.h" #include "sound.h" -#if CONFIG_CPU == PNX0101 -#include "string.h" -#endif /* CONFIG_CPU == PNX0101 */ /** * APIs implemented in the target-specific portion: @@ -53,15 +50,29 @@ void pcm_play_pause_unpause(void); /** Functions that require targeted implementation **/ -#if !defined(CPU_COLDFIRE) && (CONFIG_CPU != S3C2440) - -#if (CONFIG_CPU == PNX0101) - -#define DMA_BUF_SAMPLES 0x100 +#if defined(CPU_COLDFIRE) || (CONFIG_CPU == S3C2440) +/* Implemented in target/... */ +#else +/* dummy functions for those not actually supporting all this yet */ +void pcm_apply_settings(void) +{ +} +/** **/ -short __attribute__((section(".dmabuf"))) dma_buf_left[DMA_BUF_SAMPLES]; -short __attribute__((section(".dmabuf"))) dma_buf_right[DMA_BUF_SAMPLES]; +void pcm_mute(bool mute) +{ +#if defined(HAVE_WM8975) || defined(HAVE_WM8758) \ + || defined(HAVE_WM8731) || defined(HAVE_WM8721) + audiohw_mute(mute); +#endif + if (mute) + sleep(HZ/16); +} +#endif /* defined(CPU_COLDFIRE) || (CONFIG_CPU == S3C2440) */ +#if defined(CPU_COLDFIRE) || (CONFIG_CPU == S3C2440) || defined(CPU_PP) +/* Implemented in target/... */ +#else static int pcm_freq = HW_SAMPR_DEFAULT; /* 44.1 is default */ unsigned short* p IBSS_ATTR; @@ -90,136 +101,6 @@ void pcm_play_pause_unpause(void) { } -static inline void fill_dma_buf(int offset) -{ - short *l, *r, *lend; - - l = dma_buf_left + offset; - lend = l + DMA_BUF_SAMPLES / 2; - r = dma_buf_right + offset; - - if (pcm_playing && !pcm_paused) - { - do - { - int count; - unsigned short *tmp_p; - count = MIN(p_size / 4, (size_t)(lend - l)); - tmp_p = p; - p_size -= count * 4; - - if ((int)l & 3) - { - *l++ = *tmp_p++; - *r++ = *tmp_p++; - count--; - } - while (count >= 4) - { - asm("ldmia %0!, {r0, r1, r2, r3}\n\t" - "and r4, r0, %3\n\t" - "orr r4, r4, r1, lsl #16\n\t" - "and r5, r2, %3\n\t" - "orr r5, r5, r3, lsl #16\n\t" - "stmia %1!, {r4, r5}\n\t" - "bic r4, r1, %3\n\t" - "orr r4, r4, r0, lsr #16\n\t" - "bic r5, r3, %3\n\t" - "orr r5, r5, r2, lsr #16\n\t" - "stmia %2!, {r4, r5}" - : "+r" (tmp_p), "+r" (l), "+r" (r) - : "r" (0xffff) - : "r0", "r1", "r2", "r3", "r4", "r5", "memory"); - count -= 4; - } - while (count > 0) - { - *l++ = *tmp_p++; - *r++ = *tmp_p++; - count--; - } - p = tmp_p; - if (l >= lend) - return; - else if (pcm_callback_for_more) - pcm_callback_for_more((unsigned char**)&p, - &p_size); - } - while (p_size); - pcm_playing = false; - } - - if (l < lend) - { - memset(l, 0, sizeof(short) * (lend - l)); - memset(r, 0, sizeof(short) * (lend - l)); - } -} - -static void audio_irq(void) -{ - unsigned long st = DMAINTSTAT & ~DMAINTEN; - int i; - for (i = 0; i < 2; i++) - if (st & (1 << i)) - { - fill_dma_buf((i == 1) ? 0 : DMA_BUF_SAMPLES / 2); - DMAINTSTAT = 1 << i; - } -} - -unsigned long physical_address(void *p) -{ - unsigned long adr = (unsigned long)p; - return (MMUBLOCK((adr >> 21) & 0xf) << 21) | (adr & ((1 << 21) - 1)); -} - -void pcm_init(void) -{ - int i; - - pcm_playing = false; - pcm_paused = false; - pcm_callback_for_more = NULL; - - memset(dma_buf_left, 0, sizeof(dma_buf_left)); - memset(dma_buf_right, 0, sizeof(dma_buf_right)); - - for (i = 0; i < 8; i++) - { - DMASRC(i) = 0; - DMADEST(i) = 0; - DMALEN(i) = 0x1ffff; - DMAR0C(i) = 0; - DMAR10(i) = 0; - DMAR1C(i) = 0; - } - - DMAINTSTAT = 0xc000ffff; - DMAINTEN = 0xc000ffff; - - DMASRC(0) = physical_address(dma_buf_left); - DMADEST(0) = 0x80200280; - DMALEN(0) = 0xff; - DMAR1C(0) = 0; - DMAR0C(0) = 0x40408; - - DMASRC(1) = physical_address(dma_buf_right); - DMADEST(1) = 0x80200284; - DMALEN(1) = 0xff; - DMAR1C(1) = 0; - DMAR0C(1) = 0x40409; - - irq_set_int_handler(0x1b, audio_irq); - irq_enable_int(0x1b); - - DMAINTSTAT = 1; - DMAINTSTAT = 2; - DMAINTEN &= ~3; - DMAR10(0) |= 1; - DMAR10(1) |= 1; -} - void pcm_postinit(void) { audiohw_postinit(); @@ -234,24 +115,7 @@ size_t pcm_get_bytes_waiting(void) { return p_size; } -#endif /* CONFIG_CPU == */ -/* dummy functions for those not actually supporting all this yet */ -void pcm_apply_settings(void) -{ -} -/** **/ - -void pcm_mute(bool mute) -{ -#if defined(HAVE_WM8975) || defined(HAVE_WM8758) \ - || defined(HAVE_WM8731) || defined(HAVE_WM8721) - audiohw_mute(mute); -#endif - if (mute) - sleep(HZ/16); -} -#if !defined(CPU_PP) /* * This function goes directly into the DMA buffer to calculate the left and * right peak values. To avoid missing peaks it tries to look forward two full @@ -271,10 +135,8 @@ void pcm_calculate_peaks(int *left, int *right) short *addr; short *end; { -#if CONFIG_CPU == PNX0101 size_t samples = p_size / 4; addr = p; -#endif /* CONFIG_CPU */. if (samples > PEAK_SAMPLES) samples = PEAK_SAMPLES - (PEAK_STRIDE - 1); @@ -326,9 +188,7 @@ void pcm_calculate_peaks(int *left, int *right) *right = peak_value; } } -#endif /* !defined(CPU_PP) */ - -#endif /* !defined(CPU_COLDFIRE) && (CONFIG_CPU != S3C2440) */ +#endif /* defined(CPU_COLDFIRE) || (CONFIG_CPU == S3C2440) || defined(CPU_PP) */ /**************************************************************************** * Functions that do not require targeted implementation but only a targeted @@ -418,3 +278,4 @@ bool pcm_is_paused(void) { return pcm_paused; } + |