rockbox/lib/rbcodec/dsp/dsp_sample_io.h
Aidan MacDonald 6e794c9a2d rbcodec dsp: Refactor DSP init routines, restore INIT_ATTR
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
2022-12-23 12:47:10 -05:00

75 lines
3.4 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_SAMPLE_IO_H
#define DSP_SAMPLE_IO_H
/* 16-bit samples are scaled based on these constants. The shift should be
* no more than 15.
*/
#define WORD_SHIFT 12
#define WORD_FRACBITS 27
#define NATIVE_DEPTH 16
struct sample_io_data;
/* DSP initial buffer input function call prototype */
typedef void (*sample_input_fn_type)(struct sample_io_data *this,
struct dsp_buffer **buf_p);
/* DSP final buffer output function call prototype */
typedef void (*sample_output_fn_type)(struct sample_io_data *this,
struct dsp_buffer *src,
struct dsp_buffer *dst);
/* This becomes part of the DSP aggregate */
struct sample_io_data
{
int outcount; /* 00h: Output count */
struct sample_format format; /* Format for next dsp_process call */
int sample_depth; /* Codec-specified sample depth */
int stereo_mode; /* Codec-specified channel format */
sample_input_fn_type input_samples; /* Initial input function */
struct dsp_buffer sample_buf; /* Buffer descriptor for converted samples */
int32_t *sample_buf_p[2]; /* Internal format buffer pointers */
sample_output_fn_type output_samples; /* Final output function */
unsigned int output_sampr; /* Master output samplerate */
uint8_t format_dirty; /* Format change set, avoids superfluous
increments before carrying it out */
uint8_t output_version; /* Format version of src buffer at output */
};
void dsp_sample_input_init(struct sample_io_data *this, unsigned int dsp_id) INIT_ATTR;
void dsp_sample_input_flush(struct sample_io_data *this);
void dsp_sample_input_format_change(struct sample_io_data *this,
struct sample_format *format);
void dsp_sample_output_init(struct sample_io_data *this) INIT_ATTR;
void dsp_sample_output_flush(struct sample_io_data *this);
void dsp_sample_output_format_change(struct sample_io_data *this,
struct sample_format *format);
/* Sample IO watches the format setting from the codec */
void dsp_sample_io_init(struct sample_io_data *this, unsigned int dsp_id) INIT_ATTR;
bool dsp_sample_io_configure(struct sample_io_data *this,
unsigned int setting,
intptr_t *value_p);
#endif /* DSP_SAMPLE_IO_H */