summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-02-01 00:17:36 +0000
committerDave Chapman <dave@dchapman.com>2006-02-01 00:17:36 +0000
commitb4bc9fd068368c124835e086eb73b91a7363ce2f (patch)
tree5015d16479a2626e713549aa0384ea3834f1b054
parent5fff854126b0367168bdcbb24f6c49f053c045ee (diff)
downloadrockbox-b4bc9fd068368c124835e086eb73b91a7363ce2f.tar.gz
rockbox-b4bc9fd068368c124835e086eb73b91a7363ce2f.tar.bz2
rockbox-b4bc9fd068368c124835e086eb73b91a7363ce2f.zip
iPod: Enable peakmeter
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8516 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/pcm_playback.c142
1 files changed, 72 insertions, 70 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index d6a196d649..a9e1e1ff99 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -107,70 +107,6 @@ static void dma_stop(void)
pcm_paused = false;
}
-/*
- * 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
- * peek periods (2/HZ sec, 100% overlap), although it's always possible that
- * the entire period will not be visible. To reduce CPU load it only looks at
- * every third sample, and this can be reduced even further if needed (even
- * every tenth sample would still be pretty accurate).
- */
-
-#define PEAK_SAMPLES (44100*2/HZ) /* 44100 samples * 2 / 100 Hz tick */
-#define PEAK_STRIDE 3 /* every 3rd sample is plenty... */
-
-void pcm_calculate_peaks(int *left, int *right)
-{
- long samples = (BCR0 & 0xffffff) / 4;
- short *addr = (short *) (SAR0 & ~3);
-
- if (samples > PEAK_SAMPLES)
- samples = PEAK_SAMPLES;
-
- samples /= PEAK_STRIDE;
-
- if (left && right) {
- int left_peak = 0, right_peak = 0, value;
-
- while (samples--) {
- if ((value = addr [0]) > left_peak)
- left_peak = value;
- else if (-value > left_peak)
- left_peak = -value;
-
- if ((value = addr [PEAK_STRIDE | 1]) > right_peak)
- right_peak = value;
- else if (-value > right_peak)
- right_peak = -value;
-
- addr += PEAK_STRIDE * 2;
- }
-
- *left = left_peak;
- *right = right_peak;
- }
- else if (left || right) {
- int peak_value = 0, value;
-
- if (right)
- addr += (PEAK_STRIDE | 1);
-
- while (samples--) {
- if ((value = addr [0]) > peak_value)
- peak_value = value;
- else if (-value > peak_value)
- peak_value = -value;
-
- addr += PEAK_STRIDE * 2;
- }
-
- if (left)
- *left = peak_value;
- else
- *right = peak_value;
- }
-}
-
/* sets frequency of input to DAC */
void pcm_set_frequency(unsigned int frequency)
{
@@ -510,12 +446,6 @@ bool pcm_is_playing(void)
return pcm_playing;
}
-void pcm_calculate_peaks(int *left, int *right)
-{
- *left=0;
- *right=0;
-}
-
long pcm_get_bytes_waiting(void)
{
return size;
@@ -578,3 +508,75 @@ long pcm_get_bytes_waiting(void)
}
#endif
+
+#if CONFIG_CPU != PNX0101
+/*
+ * 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
+ * peek periods (2/HZ sec, 100% overlap), although it's always possible that
+ * the entire period will not be visible. To reduce CPU load it only looks at
+ * every third sample, and this can be reduced even further if needed (even
+ * every tenth sample would still be pretty accurate).
+ */
+
+#define PEAK_SAMPLES (44100*2/HZ) /* 44100 samples * 2 / 100 Hz tick */
+#define PEAK_STRIDE 3 /* every 3rd sample is plenty... */
+
+void pcm_calculate_peaks(int *left, int *right)
+{
+#ifdef HAVE_UDA1380
+ long samples = (BCR0 & 0xffffff) / 4;
+ short *addr = (short *) (SAR0 & ~3);
+#elif defined(HAVE_WM8975)
+ long samples = size / 4;
+ short *addr = p;
+#endif
+
+ if (samples > PEAK_SAMPLES)
+ samples = PEAK_SAMPLES;
+
+ samples /= PEAK_STRIDE;
+
+ if (left && right) {
+ int left_peak = 0, right_peak = 0, value;
+
+ while (samples--) {
+ if ((value = addr [0]) > left_peak)
+ left_peak = value;
+ else if (-value > left_peak)
+ left_peak = -value;
+
+ if ((value = addr [PEAK_STRIDE | 1]) > right_peak)
+ right_peak = value;
+ else if (-value > right_peak)
+ right_peak = -value;
+
+ addr += PEAK_STRIDE * 2;
+ }
+
+ *left = left_peak;
+ *right = right_peak;
+ }
+ else if (left || right) {
+ int peak_value = 0, value;
+
+ if (right)
+ addr += (PEAK_STRIDE | 1);
+
+ while (samples--) {
+ if ((value = addr [0]) > peak_value)
+ peak_value = value;
+ else if (-value > peak_value)
+ peak_value = -value;
+
+ addr += PEAK_STRIDE * 2;
+ }
+
+ if (left)
+ *left = peak_value;
+ else
+ *right = peak_value;
+ }
+}
+
+#endif