Collect the 16-bit signed range sample clipping routines scattered about, which can be optimized on armv6 and create firmware/export/dsp-util.h (for lack of better place right now).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31142 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2011-12-04 18:19:39 +00:00
parent 700e360b61
commit a43df152c2
7 changed files with 58 additions and 47 deletions

View file

@ -43,6 +43,7 @@
#include "pcm_record.h"
#endif
#include "dsp.h"
#include "dsp-util.h"
#endif
#include "gcc_extensions.h"

View file

@ -57,25 +57,7 @@ void DSP_write( struct Spc_Dsp* this, int i, int data )
}
}
#if ARM_ARCH >= 6
/* if ( n < -32768 ) out = -32768; */
/* if ( n > 32767 ) out = 32767; */
#define CLAMP16( n ) \
({ \
asm ("ssat %0, #16, %1" \
: "=r" ( n ) : "r"( n ) ); \
n; \
})
#else
/* if ( n < -32768 ) out = -32768; */
/* if ( n > 32767 ) out = 32767; */
#define CLAMP16( n ) \
({ \
if ( (int16_t) n != n ) \
n = 0x7FFF ^ (n >> 31); \
n; \
})
#endif
#define CLAMP16( n ) clip_sample_16( n )
#if SPC_BRRCACHE
static void decode_brr( struct Spc_Dsp* this, unsigned start_addr,

View file

@ -19,15 +19,12 @@
*
****************************************************************************/
#include "config.h"
#include <stdbool.h>
#include <inttypes.h>
#include <string.h>
#include "system.h"
#include <sound.h>
#include "dsp.h"
#include "dsp-util.h"
#include "eq.h"
#include "kernel.h"
#include "system.h"
#include "settings.h"
#include "replaygain.h"
#include "tdspeed.h"
@ -261,14 +258,6 @@ static int32_t release_gain IBSS_ATTR; /* S7.24 format */
static void compressor_process(int count, int32_t *buf[]);
/* Clip sample to signed 16 bit range */
static inline int32_t clip_sample_16(int32_t sample)
{
if ((int16_t)sample != sample)
sample = 0x7fff ^ (sample >> 31);
return sample;
}
#ifdef HAVE_PITCHSCREEN
int32_t sound_get_pitch(void)
{

View file

@ -27,6 +27,7 @@
#include "pcm.h"
#include "pcm_mixer.h"
#include "pcmbuf.h"
#include "dsp-util.h"
#include "playback.h"
#include "codec_thread.h"
@ -828,14 +829,6 @@ static size_t crossfade_find_buftail(size_t buffer_rem, size_t buffer_need)
return buffer_rem;
}
/* Clip sample to signed 16 bit range */
static FORCE_INLINE int32_t clip_sample_16(int32_t sample)
{
if ((int16_t)sample != sample)
sample = 0x7fff ^ (sample >> 31);
return sample;
}
/* Returns the number of bytes _NOT_ mixed/faded */
static int crossfade_mix_fade(int factor, size_t size, void *buf, size_t *out_index,
unsigned long elapsed, off_t offset)

View file

@ -66,6 +66,7 @@ void* plugin_get_buffer(size_t *buffer_size);
#include "filefuncs.h"
#if (CONFIG_CODEC == SWCODEC)
#include "pcm_mixer.h"
#include "dsp-util.h"
#include "dsp.h"
#include "codecs.h"
#include "playback.h"

View file

@ -0,0 +1,51 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2011 by Michael Sevakis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef DSP_HELPER_H
#define DSP_HELPER_H
/** Clip sample to signed 16 bit range **/
#ifdef CPU_ARM
#if ARM_ARCH >= 6
static FORCE_INLINE int32_t clip_sample_16(int32_t sample)
{
int32_t out;
asm ("ssat %0, #16, %1"
: "=r" (out) : "r"(sample));
return out;
}
#define CLIP_SAMPLE_16_DEFINED
#endif /* ARM_ARCH */
#endif /* CPU_ARM */
#ifndef CLIP_SAMPLE_16_DEFINED
/* Generic implementation */
static FORCE_INLINE int32_t clip_sample_16(int32_t sample)
{
if ((int16_t)sample != sample)
sample = 0x7fff ^ (sample >> 31);
return sample;
}
#endif /* CLIP_SAMPLE_16_DEFINED */
#undef CLIP_SAMPLE_16_DEFINED
#endif /* DSP_HELPER_H */

View file

@ -95,13 +95,7 @@ static unsigned int idle_counter = 0;
/** Generic mixing routines **/
#ifndef MIXER_OPTIMIZED_MIX_SAMPLES
/* Clip sample to signed 16 bit range */
static FORCE_INLINE int32_t clip_sample_16(int32_t sample)
{
if ((int16_t)sample != sample)
sample = 0x7fff ^ (sample >> 31);
return sample;
}
#include "dsp-util.h" /* for clip_sample_16 */
/* Mix channels' samples and apply gain factors */
static FORCE_INLINE void mix_samples(uint32_t *out,