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:
parent
700e360b61
commit
a43df152c2
7 changed files with 58 additions and 47 deletions
|
@ -43,6 +43,7 @@
|
|||
#include "pcm_record.h"
|
||||
#endif
|
||||
#include "dsp.h"
|
||||
#include "dsp-util.h"
|
||||
#endif
|
||||
|
||||
#include "gcc_extensions.h"
|
||||
|
|
|
@ -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,
|
||||
|
|
15
apps/dsp.c
15
apps/dsp.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
51
firmware/export/dsp-util.h
Normal file
51
firmware/export/dsp-util.h
Normal 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 */
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue