forked from len0rd/rockbox
		
	Refactor DSP init routines so there is a dedicated init function for the stages that need it. Remove the DSP_INIT configure message. This allows the init code to be safely marked INIT_ATTR, saving a bit of code size, and allowing the linker to verify that there are no unsafe references to the init routines. Change-Id: I1702f0f579bbb300a6fe7d0e67b13aa2e9dd7f8a
		
			
				
	
	
		
			179 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************
 | |
|  *             __________               __   ___.
 | |
|  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
|  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
|  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
|  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
|  *                     \/            \/     \/    \/            \/
 | |
|  * $Id$
 | |
|  *
 | |
|  * Copyright (C) 2012 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_PROC_ENTRY_H
 | |
| #define DSP_PROC_ENTRY_H
 | |
| 
 | |
| #if 0 /* Set to '1' to enable local debug messages */
 | |
| #include <debug.h>
 | |
| #else
 | |
| #undef DEBUGF
 | |
| #define DEBUGF(...)
 | |
| #endif
 | |
| 
 | |
| /* Macros to generate the right stuff */
 | |
| #ifdef DSP_PROC_DB_CREATE
 | |
| struct dsp_proc_db_entry;
 | |
| 
 | |
| #define DSP_PROC_DB_START
 | |
| #define DSP_PROC_DB_ITEM(name) \
 | |
|     extern const struct dsp_proc_db_entry name##_proc_db_entry;
 | |
| #define DSP_PROC_DB_STOP
 | |
| 
 | |
| /* Create database as externs to be able to build array */
 | |
| #include "dsp_proc_database.h"
 | |
| 
 | |
| #define DSP_PROC_DB_START \
 | |
|     static struct dsp_proc_db_entry const * const dsp_proc_database[] = {
 | |
| 
 | |
| #define DSP_PROC_DB_ITEM(name) \
 | |
|     &name##_proc_db_entry,
 | |
| 
 | |
| #define DSP_PROC_DB_STOP };
 | |
| 
 | |
| /* Create database as array */
 | |
| #include "dsp_proc_database.h"
 | |
| 
 | |
| /* Number of effects in database - all available in audio DSP */
 | |
| #define DSP_NUM_PROC_STAGES ARRAYLEN(dsp_proc_database)
 | |
| 
 | |
| /* Number of possible effects for voice DSP */
 | |
| #ifdef HAVE_SW_TONE_CONTROLS
 | |
| #define DSP_VOICE_NUM_PROC_STAGES 2 /* resample, tone */
 | |
| #else
 | |
| #define DSP_VOICE_NUM_PROC_STAGES 1 /* resample */
 | |
| #endif
 | |
| 
 | |
| #else /* !DSP_PROC_DB_CREATE */
 | |
| 
 | |
| #ifdef DEBUG
 | |
| #define DSP_PROC_DB_ENTRY(_name, _configure) \
 | |
|     const struct dsp_proc_db_entry _name##_proc_db_entry = \
 | |
|     { .id = DSP_PROC_##_name, .configure = _configure,    \
 | |
|       .name = #_name };
 | |
| #else /* !DEBUG */
 | |
| #define DSP_PROC_DB_ENTRY(_name, _configure) \
 | |
|     const struct dsp_proc_db_entry _name##_proc_db_entry = \
 | |
|     { .id = DSP_PROC_##_name, .configure = _configure };
 | |
| #endif /* DEBUG */
 | |
| 
 | |
| #endif /* DSP_PROC_DB_CREATE */
 | |
| 
 | |
| #define DSP_PROC_DB_START \
 | |
|     enum dsp_proc_ids             \
 | |
|     {                             \
 | |
|         ___DSP_PROC_ID_RESERVED = 0,
 | |
| 
 | |
| #define DSP_PROC_DB_ITEM(name) \
 | |
|     DSP_PROC_##name,
 | |
| 
 | |
| #define DSP_PROC_DB_STOP };
 | |
| 
 | |
| /* Create database as enums for use as ids */
 | |
| #include "dsp_proc_database.h"
 | |
| 
 | |
| struct dsp_proc_entry;
 | |
| 
 | |
| #include "dsp_core.h"
 | |
| 
 | |
| /* DSP sample transform function prototype */
 | |
| typedef void (*dsp_proc_fn_type)(struct dsp_proc_entry *this,
 | |
|                                  struct dsp_buffer **buf);
 | |
| 
 | |
| /**
 | |
|  * dsp_proc_entry
 | |
|  * The structure allocated to every stage when enabled.
 | |
|  *
 | |
|  * default settings:
 | |
|  *  .data    = 0
 | |
|  *  .process = dsp_empty_process (dsp_core.c)
 | |
|  *
 | |
|  * DSP_PROC_INIT handler just has to change what it needs to change. It may
 | |
|  * also be modified at any time to implement the stage's demands.
 | |
|  */
 | |
| struct dsp_proc_entry
 | |
| {
 | |
|     intptr_t         data;    /* 00h: any value, used by asm */
 | |
|     dsp_proc_fn_type process; /* Processing vector */
 | |
| };
 | |
| 
 | |
| /* Return values for DSP_PROC_NEW_FORMAT setting */
 | |
| enum
 | |
| {
 | |
|     PROC_NEW_FORMAT_OK = 0,      /* Acks, calls process() (default) */
 | |
|     PROC_NEW_FORMAT_DEACTIVATED, /* Acks, does not call process() */
 | |
|     PROC_NEW_FORMAT_TRANSITION   /* Does not ack, calls process() */
 | |
| };
 | |
| 
 | |
| /* DSP transform configure function prototype */
 | |
| typedef intptr_t (*dsp_proc_config_fn_type)(struct dsp_proc_entry *this,
 | |
|                                             struct dsp_config *dsp,
 | |
|                                             unsigned int setting,
 | |
|                                             intptr_t value);
 | |
| typedef void (*dsp_proc_init_fn_type)(struct dsp_config *dsp,
 | |
|                                       unsigned int dsp_id);
 | |
| 
 | |
| /* Enable/disable a processing stage - not to be called during processing
 | |
|  * by processing code! */
 | |
| void dsp_proc_enable(struct dsp_config *dsp, enum dsp_proc_ids id,
 | |
|                      bool enable);
 | |
| 
 | |
| /* Is the specified stage enabled on the DSP? */
 | |
| bool dsp_proc_enabled(struct dsp_config *dsp, enum dsp_proc_ids id);
 | |
| 
 | |
| /* Activate/deactivate processing stage, doesn't affect enabled status
 | |
|  * thus will not enable anything -
 | |
|  * may be called during processing to activate/deactivate for format
 | |
|  * changes */
 | |
| void dsp_proc_activate(struct dsp_config *dsp, enum dsp_proc_ids id,
 | |
|                        bool activate);
 | |
| 
 | |
| /* Is the specified stage active on the DSP? */
 | |
| bool dsp_proc_active(struct dsp_config *dsp, enum dsp_proc_ids id);
 | |
| 
 | |
| /* Force the specified stage to receive a format update before the next
 | |
|  * buffer is sent to process() */
 | |
| void dsp_proc_want_format_update(struct dsp_config *dsp,
 | |
|                                  enum dsp_proc_ids id);
 | |
| 
 | |
| /* Set or unset in-place operation */
 | |
| void dsp_proc_set_in_place(struct dsp_config *dsp, enum dsp_proc_ids id,
 | |
|                            bool in_place);
 | |
| 
 | |
| #define DSP_PRINT_FORMAT(id, format) \
 | |
|     DEBUGF("DSP format- " #id "\n"                      \
 | |
|            "  ver:%u ch:%u fb:%u os:%u hz:%u chz:%u\n", \
 | |
|            (unsigned int)(format).version,              \
 | |
|            (unsigned int)(format).num_channels,         \
 | |
|            (unsigned int)(format).frac_bits,            \
 | |
|            (unsigned int)(format).output_scale,         \
 | |
|            (unsigned int)(format).frequency,            \
 | |
|            (unsigned int)(format).codec_frequency);
 | |
| 
 | |
| struct dsp_proc_db_entry
 | |
| {
 | |
|     enum dsp_proc_ids id;              /* id of this stage */
 | |
|     dsp_proc_config_fn_type configure; /* dsp_configure hook */
 | |
| #ifdef DEBUG
 | |
|     const char *name;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| #endif /* DSP_PROC_ENTRY_H */
 |