summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-13 04:12:23 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-13 04:12:23 +0000
commit18c7e0eba469e1be2e0c95120a4039071ac46ead (patch)
tree0644ae6e48a7507aecef5defd47385e610e48cc4
parent85f0873682635eeab11c1e6834ce0734b9cd3569 (diff)
downloadrockbox-18c7e0eba469e1be2e0c95120a4039071ac46ead.zip
rockbox-18c7e0eba469e1be2e0c95120a4039071ac46ead.tar.gz
rockbox-18c7e0eba469e1be2e0c95120a4039071ac46ead.tar.bz2
rockbox-18c7e0eba469e1be2e0c95120a4039071ac46ead.tar.xz
Trim down peak calculation a bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25978 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/pcm.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/firmware/pcm.c b/firmware/pcm.c
index 8d2ec2b..a69f0a8 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -92,46 +92,46 @@ unsigned long pcm_sampr SHAREDBSS_ATTR = HW_SAMPR_DEFAULT;
int pcm_fsel SHAREDBSS_ATTR = HW_FREQ_DEFAULT;
/**
- * Do peak calculation using distance squared from axis and save a lot
- * of jumps and negation. Don't bother with the calculations of left or
- * right only as it's never really used and won't save much time.
+ * Perform peak calculation on a buffer of packed 16-bit samples.
*
* Used for recording and playback.
*/
-static void pcm_peak_peeker(const void *addr, int count, int peaks[2])
+static void pcm_peak_peeker(const int32_t *addr, int count, int peaks[2])
{
- int32_t peak_l = 0, peak_r = 0;
- int32_t peaksq_l = 0, peaksq_r = 0;
+ int peak_l = 0, peak_r = 0;
+ const int32_t * const end = addr + count;
do
{
- int32_t value = *(int32_t *)addr;
- int32_t ch, chsq;
+ int32_t value = *addr;
+ int ch;
+
#ifdef ROCKBOX_BIG_ENDIAN
ch = value >> 16;
#else
ch = (int16_t)value;
#endif
- chsq = ch*ch;
- if (chsq > peaksq_l)
- peak_l = ch, peaksq_l = chsq;
+ if (ch < 0)
+ ch = -ch;
+ if (ch > peak_l)
+ peak_l = ch;
#ifdef ROCKBOX_BIG_ENDIAN
ch = (int16_t)value;
#else
ch = value >> 16;
#endif
- chsq = ch*ch;
- if (chsq > peaksq_r)
- peak_r = ch, peaksq_r = chsq;
+ if (ch < 0)
+ ch = -ch;
+ if (ch > peak_r)
+ peak_r = ch;
- addr += 16;
- count -= 4;
+ addr += 4;
}
- while (count > 0);
+ while (addr < end);
- peaks[0] = abs(peak_l);
- peaks[1] = abs(peak_r);
+ peaks[0] = peak_l;
+ peaks[1] = peak_r;
}
void pcm_calculate_peaks(int *left, int *right)
@@ -167,7 +167,7 @@ void pcm_calculate_peaks(int *left, int *right)
count = MIN(framecount, count);
if (count > 0)
- pcm_peak_peeker(addr, count, peaks);
+ pcm_peak_peeker((int32_t *)addr, count, peaks);
/* else keep previous peak values */
}
else
@@ -390,7 +390,7 @@ void pcm_calculate_rec_peaks(int *left, int *right)
if (count > 0)
{
- pcm_peak_peeker(peak_addr, count, peaks);
+ pcm_peak_peeker((int32_t *)peak_addr, count, peaks);
if (peak_addr == pcm_rec_peak_addr)
pcm_rec_peak_addr = addr;