1
0
Fork 0
forked from len0rd/rockbox

Trim down peak calculation a bit.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25978 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2010-05-13 04:12:23 +00:00
parent 85f0873682
commit 18c7e0eba4

View file

@ -92,46 +92,46 @@ unsigned long pcm_sampr SHAREDBSS_ATTR = HW_SAMPR_DEFAULT;
int pcm_fsel SHAREDBSS_ATTR = HW_FREQ_DEFAULT; int pcm_fsel SHAREDBSS_ATTR = HW_FREQ_DEFAULT;
/** /**
* Do peak calculation using distance squared from axis and save a lot * Perform peak calculation on a buffer of packed 16-bit samples.
* 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.
* *
* Used for recording and playback. * 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; int peak_l = 0, peak_r = 0;
int32_t peaksq_l = 0, peaksq_r = 0; const int32_t * const end = addr + count;
do do
{ {
int32_t value = *(int32_t *)addr; int32_t value = *addr;
int32_t ch, chsq; int ch;
#ifdef ROCKBOX_BIG_ENDIAN #ifdef ROCKBOX_BIG_ENDIAN
ch = value >> 16; ch = value >> 16;
#else #else
ch = (int16_t)value; ch = (int16_t)value;
#endif #endif
chsq = ch*ch; if (ch < 0)
if (chsq > peaksq_l) ch = -ch;
peak_l = ch, peaksq_l = chsq; if (ch > peak_l)
peak_l = ch;
#ifdef ROCKBOX_BIG_ENDIAN #ifdef ROCKBOX_BIG_ENDIAN
ch = (int16_t)value; ch = (int16_t)value;
#else #else
ch = value >> 16; ch = value >> 16;
#endif #endif
chsq = ch*ch; if (ch < 0)
if (chsq > peaksq_r) ch = -ch;
peak_r = ch, peaksq_r = chsq; if (ch > peak_r)
peak_r = ch;
addr += 16; addr += 4;
count -= 4;
} }
while (count > 0); while (addr < end);
peaks[0] = abs(peak_l); peaks[0] = peak_l;
peaks[1] = abs(peak_r); peaks[1] = peak_r;
} }
void pcm_calculate_peaks(int *left, int *right) void pcm_calculate_peaks(int *left, int *right)
@ -167,7 +167,7 @@ void pcm_calculate_peaks(int *left, int *right)
count = MIN(framecount, count); count = MIN(framecount, count);
if (count > 0) if (count > 0)
pcm_peak_peeker(addr, count, peaks); pcm_peak_peeker((int32_t *)addr, count, peaks);
/* else keep previous peak values */ /* else keep previous peak values */
} }
else else
@ -390,7 +390,7 @@ void pcm_calculate_rec_peaks(int *left, int *right)
if (count > 0) 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) if (peak_addr == pcm_rec_peak_addr)
pcm_rec_peak_addr = addr; pcm_rec_peak_addr = addr;