rbcodec: Hooks for target specific functions in dsp_process loop
Use them to move tick counting, yielding and coldfire macsr handling code to a rockbox specific file. Change-Id: Id7417dc98c08a342eba45ba56b044a276e50564b Reviewed-on: http://gerrit.rockbox.org/229 Tested-by: Nils Wallménius <nils@rockbox.org> Reviewed-by: Nils Wallménius <nils@rockbox.org>
This commit is contained in:
parent
00cf2ce711
commit
dbe5e5f2df
3 changed files with 74 additions and 47 deletions
|
@ -17,6 +17,58 @@
|
||||||
* {,U}INT{8,16,32,64}_{MIN,MAX} */
|
* {,U}INT{8,16,32,64}_{MIN,MAX} */
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
|
/* Structure to record some info during processing call */
|
||||||
|
struct dsp_loop_context
|
||||||
|
{
|
||||||
|
long last_yield;
|
||||||
|
#ifdef CPU_COLDFIRE
|
||||||
|
unsigned long old_macsr;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void dsp_process_start(struct dsp_loop_context *ctx)
|
||||||
|
{
|
||||||
|
/* At least perform one yield before starting */
|
||||||
|
ctx->last_yield = current_tick;
|
||||||
|
yield();
|
||||||
|
#if defined(CPU_COLDFIRE)
|
||||||
|
/* set emac unit for dsp processing, and save old macsr, we're running in
|
||||||
|
codec thread context at this point, so can't clobber it */
|
||||||
|
ctx->old_macsr = coldfire_get_macsr();
|
||||||
|
coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dsp_process_loop(struct dsp_loop_context *ctx)
|
||||||
|
{
|
||||||
|
/* Yield at least once each tick */
|
||||||
|
long tick = current_tick;
|
||||||
|
if (TIME_AFTER(tick, ctx->last_yield))
|
||||||
|
{
|
||||||
|
ctx->last_yield = tick;
|
||||||
|
yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dsp_process_end(struct dsp_loop_context *ctx)
|
||||||
|
{
|
||||||
|
#if defined(CPU_COLDFIRE)
|
||||||
|
/* set old macsr again */
|
||||||
|
coldfire_set_macsr(ctx->old_macsr);
|
||||||
|
#endif
|
||||||
|
(void)ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DSP_PROCESS_START() \
|
||||||
|
struct dsp_loop_context __ctx; \
|
||||||
|
dsp_process_start(&__ctx)
|
||||||
|
|
||||||
|
#define DSP_PROCESS_LOOP() \
|
||||||
|
dsp_process_loop(&__ctx)
|
||||||
|
|
||||||
|
#define DSP_PROCESS_END() \
|
||||||
|
dsp_process_end(&__ctx)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "platform.h"
|
||||||
#include "dsp_core.h"
|
#include "dsp_core.h"
|
||||||
#include "dsp_sample_io.h"
|
#include "dsp_sample_io.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -52,9 +53,6 @@ struct dsp_config
|
||||||
active/enabled stages */
|
active/enabled stages */
|
||||||
|
|
||||||
/** Misc. extra stuff **/
|
/** Misc. extra stuff **/
|
||||||
#ifdef CPU_COLDFIRE
|
|
||||||
unsigned long old_macsr; /* Old macsr value to restore */
|
|
||||||
#endif
|
|
||||||
#if 0 /* Not needed now but enable if something must know this */
|
#if 0 /* Not needed now but enable if something must know this */
|
||||||
bool processing; /* DSP is processing (to thwart inopportune
|
bool processing; /* DSP is processing (to thwart inopportune
|
||||||
buffer moves) */
|
buffer moves) */
|
||||||
|
@ -350,31 +348,12 @@ bool dsp_proc_call(struct dsp_proc_entry *this, struct dsp_buffer **buf_p,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void dsp_process_start(struct dsp_config *dsp)
|
#ifndef DSP_PROCESS_START
|
||||||
{
|
/* These do nothing if not previously defined */
|
||||||
#if defined(CPU_COLDFIRE)
|
#define DSP_PROCESS_START()
|
||||||
/* set emac unit for dsp processing, and save old macsr, we're running in
|
#define DSP_PROCESS_LOOP()
|
||||||
codec thread context at this point, so can't clobber it */
|
#define DSP_PROCESS_END()
|
||||||
dsp->old_macsr = coldfire_get_macsr();
|
#endif /* !DSP_PROCESS_START */
|
||||||
coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
|
|
||||||
#endif
|
|
||||||
#if 0 /* Not needed now but enable if something must know this */
|
|
||||||
dsp->processing = true;
|
|
||||||
#endif
|
|
||||||
(void)dsp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void dsp_process_end(struct dsp_config *dsp)
|
|
||||||
{
|
|
||||||
#if 0 /* Not needed now but enable if something must know this */
|
|
||||||
dsp->processing = false;
|
|
||||||
#endif
|
|
||||||
#if defined(CPU_COLDFIRE)
|
|
||||||
/* set old macsr again */
|
|
||||||
coldfire_set_macsr(dsp->old_macsr);
|
|
||||||
#endif
|
|
||||||
(void)dsp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dsp_process:
|
* dsp_process:
|
||||||
|
@ -429,11 +408,10 @@ void dsp_process(struct dsp_config *dsp, struct dsp_buffer *src,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* At least perform one yield before starting */
|
DSP_PROCESS_START();
|
||||||
long last_yield = current_tick;
|
#if 0 /* Not needed now but enable if something must know this */
|
||||||
yield();
|
dsp->processing = true;
|
||||||
|
#endif
|
||||||
dsp_process_start(dsp);
|
|
||||||
|
|
||||||
/* Tag input with codec-specified sample format */
|
/* Tag input with codec-specified sample format */
|
||||||
src->format = dsp->io_data.format;
|
src->format = dsp->io_data.format;
|
||||||
|
@ -478,16 +456,14 @@ void dsp_process(struct dsp_config *dsp, struct dsp_buffer *src,
|
||||||
dsp_advance_buffer32(buf, outcount);
|
dsp_advance_buffer32(buf, outcount);
|
||||||
dsp_advance_buffer_output(dst, outcount);
|
dsp_advance_buffer_output(dst, outcount);
|
||||||
|
|
||||||
/* Yield at least once each tick */
|
DSP_PROCESS_LOOP();
|
||||||
long tick = current_tick;
|
|
||||||
if (TIME_AFTER(tick, last_yield))
|
|
||||||
{
|
|
||||||
last_yield = tick;
|
|
||||||
yield();
|
|
||||||
}
|
|
||||||
} /* while */
|
} /* while */
|
||||||
|
|
||||||
dsp_process_end(dsp);
|
#if 0 /* Not needed now but enable if something must know this */
|
||||||
|
dsp->process = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DSP_PROCESS_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t dsp_configure(struct dsp_config *dsp, unsigned int setting,
|
intptr_t dsp_configure(struct dsp_config *dsp, unsigned int setting,
|
||||||
|
|
|
@ -45,11 +45,6 @@
|
||||||
/***************** EXPORTED *****************/
|
/***************** EXPORTED *****************/
|
||||||
|
|
||||||
struct user_settings global_settings;
|
struct user_settings global_settings;
|
||||||
volatile long current_tick = 0;
|
|
||||||
|
|
||||||
void yield(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_irq_level(int level)
|
int set_irq_level(int level)
|
||||||
{
|
{
|
||||||
|
@ -601,6 +596,10 @@ static void ci_logf(const char *fmt, ...)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void ci_yield(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static void commit_dcache(void) {}
|
static void commit_dcache(void) {}
|
||||||
static void commit_discard_dcache(void) {}
|
static void commit_discard_dcache(void) {}
|
||||||
static void commit_discard_idcache(void) {}
|
static void commit_discard_idcache(void) {}
|
||||||
|
@ -626,7 +625,7 @@ static struct codec_api ci = {
|
||||||
ci_should_loop,
|
ci_should_loop,
|
||||||
|
|
||||||
ci_sleep,
|
ci_sleep,
|
||||||
yield,
|
ci_yield,
|
||||||
|
|
||||||
#if NUM_CORES > 1
|
#if NUM_CORES > 1
|
||||||
ci_create_thread,
|
ci_create_thread,
|
||||||
|
|
Loading…
Reference in a new issue