265 lines
8.3 KiB
C
265 lines
8.3 KiB
C
/**
|
|
* @file channel.h
|
|
* @brief Functions for interacting with DSP audio channels.
|
|
*/
|
|
#pragma once
|
|
|
|
///@name Data types
|
|
///@{
|
|
/// Supported sample encodings.
|
|
enum
|
|
{
|
|
NDSP_ENCODING_PCM8 = 0, ///< PCM8
|
|
NDSP_ENCODING_PCM16, ///< PCM16
|
|
NDSP_ENCODING_ADPCM, ///< DSPADPCM (GameCube format)
|
|
};
|
|
|
|
/// Specifies the number of channels used in a sample.
|
|
#define NDSP_CHANNELS(n) ((u32)(n) & 3)
|
|
/// Specifies the encoding used in a sample.
|
|
#define NDSP_ENCODING(n) (((u32)(n) & 3) << 2)
|
|
|
|
/// Channel format flags for use with ndspChnSetFormat.
|
|
enum
|
|
{
|
|
NDSP_FORMAT_MONO_PCM8 = NDSP_CHANNELS(1) | NDSP_ENCODING(NDSP_ENCODING_PCM8), ///< Buffer contains Mono PCM8.
|
|
NDSP_FORMAT_MONO_PCM16 = NDSP_CHANNELS(1) | NDSP_ENCODING(NDSP_ENCODING_PCM16), ///< Buffer contains Mono PCM16.
|
|
NDSP_FORMAT_MONO_ADPCM = NDSP_CHANNELS(1) | NDSP_ENCODING(NDSP_ENCODING_ADPCM), ///< Buffer contains Mono ADPCM.
|
|
NDSP_FORMAT_STEREO_PCM8 = NDSP_CHANNELS(2) | NDSP_ENCODING(NDSP_ENCODING_PCM8), ///< Buffer contains Stereo PCM8.
|
|
NDSP_FORMAT_STEREO_PCM16 = NDSP_CHANNELS(2) | NDSP_ENCODING(NDSP_ENCODING_PCM16), ///< Buffer contains Stereo PCM16.
|
|
|
|
NDSP_FORMAT_PCM8 = NDSP_FORMAT_MONO_PCM8, ///< (Alias) Buffer contains Mono PCM8.
|
|
NDSP_FORMAT_PCM16 = NDSP_FORMAT_MONO_PCM16, ///< (Alias) Buffer contains Mono PCM16.
|
|
NDSP_FORMAT_ADPCM = NDSP_FORMAT_MONO_ADPCM, ///< (Alias) Buffer contains Mono ADPCM.
|
|
|
|
// Flags
|
|
NDSP_FRONT_BYPASS = BIT(4), ///< Front bypass.
|
|
NDSP_3D_SURROUND_PREPROCESSED = BIT(6), ///< (?) Unknown, under research
|
|
};
|
|
|
|
/// Interpolation types.
|
|
typedef enum
|
|
{
|
|
NDSP_INTERP_POLYPHASE = 0, ///< Polyphase interpolation
|
|
NDSP_INTERP_LINEAR = 1, ///< Linear interpolation
|
|
NDSP_INTERP_NONE = 2, ///< No interpolation
|
|
} ndspInterpType;
|
|
|
|
///@}
|
|
|
|
///@name Basic channel operation
|
|
///@{
|
|
/**
|
|
* @brief Resets a channel.
|
|
* @param id ID of the channel (0..23).
|
|
*/
|
|
void ndspChnReset(int id);
|
|
|
|
/**
|
|
* @brief Initializes the parameters of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
*/
|
|
void ndspChnInitParams(int id);
|
|
|
|
/**
|
|
* @brief Checks whether a channel is currently playing.
|
|
* @param id ID of the channel (0..23).
|
|
* @return Whether the channel is currently playing.
|
|
*/
|
|
bool ndspChnIsPlaying(int id);
|
|
|
|
/**
|
|
* @brief Gets the current sample position of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @return The channel's sample position.
|
|
*/
|
|
u32 ndspChnGetSamplePos(int id);
|
|
|
|
/**
|
|
* @brief Gets the sequence ID of the wave buffer that is currently playing in a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @return The sequence ID of the wave buffer.
|
|
*/
|
|
u16 ndspChnGetWaveBufSeq(int id);
|
|
|
|
/**
|
|
* @brief Checks whether a channel is currently paused.
|
|
* @param id ID of the channel (0..23).
|
|
* @return Whether the channel is currently paused.
|
|
*/
|
|
bool ndspChnIsPaused(int id);
|
|
|
|
/**
|
|
* @brief Sets the pause status of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param paused Whether the channel is to be paused (true) or unpaused (false).
|
|
*/
|
|
void ndspChnSetPaused(int id, bool paused);
|
|
|
|
///@}
|
|
|
|
///@name Configuration
|
|
///@{
|
|
/**
|
|
* @brief Sets the format of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param format Format to use.
|
|
*/
|
|
void ndspChnSetFormat(int id, u16 format);
|
|
|
|
/**
|
|
*
|
|
* @brief Gets the format of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @return The format of the channel.
|
|
*/
|
|
u16 ndspChnGetFormat(int id);
|
|
|
|
/**
|
|
* @brief Sets the interpolation type of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param type Interpolation type to use.
|
|
*/
|
|
void ndspChnSetInterp(int id, ndspInterpType type);
|
|
|
|
/**
|
|
* @brief Gets the interpolation type of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @return The interpolation type of the channel.
|
|
*/
|
|
ndspInterpType ndspChnGetInterp(int id);
|
|
|
|
/**
|
|
* @brief Sets the sample rate of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param rate Sample rate to use.
|
|
*/
|
|
void ndspChnSetRate(int id, float rate);
|
|
|
|
/**
|
|
* @brief Gets the sample rate of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @return The sample rate of the channel.
|
|
*/
|
|
float ndspChnGetRate(int id);
|
|
|
|
/**
|
|
* @brief Sets the mix parameters (volumes) of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param mix Mix parameters to use. Working hypothesis:
|
|
* - 0: Front left volume.
|
|
* - 1: Front right volume.
|
|
* - 2: Back left volume:
|
|
* - 3: Back right volume:
|
|
* - 4..7: Same as 0..3, but for auxiliary output 0.
|
|
* - 8..11: Same as 0..3, but for auxiliary output 1.
|
|
*/
|
|
void ndspChnSetMix(int id, float mix[12]);
|
|
|
|
/**
|
|
* @brief Gets the mix parameters (volumes) of a channel.
|
|
* @param id ID of the channel (0..23)
|
|
* @param mix Mix parameters to write out to. See \ref ndspChnSetMix.
|
|
*/
|
|
void ndspChnGetMix(int id, float mix[12]);
|
|
|
|
/**
|
|
* @brief Sets the DSPADPCM coefficients of a channel.
|
|
* @param id ID of the channel (0..23).
|
|
* @param coefs DSPADPCM coefficients to use.
|
|
*/
|
|
void ndspChnSetAdpcmCoefs(int id, u16 coefs[16]);
|
|
///@}
|
|
|
|
///@name Wave buffers
|
|
///@{
|
|
/**
|
|
* @brief Clears the wave buffer queue of a channel and stops playback.
|
|
* @param id ID of the channel (0..23).
|
|
*/
|
|
void ndspChnWaveBufClear(int id);
|
|
|
|
/**
|
|
* @brief Adds a wave buffer to the wave buffer queue of a channel.
|
|
* @remark If the channel's wave buffer queue was empty before the use of this function, playback is started.
|
|
* @param id ID of the channel (0..23).
|
|
* @param buf Wave buffer to add.
|
|
*/
|
|
void ndspChnWaveBufAdd(int id, ndspWaveBuf* buf);
|
|
///@}
|
|
|
|
///@name IIR filters
|
|
///@{
|
|
/**
|
|
* @brief Configures whether the IIR monopole filter of a channel is enabled.
|
|
* @param id ID of the channel (0..23).
|
|
* @param enable Whether to enable the IIR monopole filter.
|
|
*/
|
|
void ndspChnIirMonoSetEnable(int id, bool enable);
|
|
/**
|
|
* @brief Manually sets up the parameters on monopole filter
|
|
* @param id ID of the channel (0..23).
|
|
* @param enable Whether to enable the IIR monopole filter.
|
|
*/
|
|
bool ndspChnIirMonoSetParamsCustomFilter(int id, float a0, float a1, float b0);
|
|
/**
|
|
* @brief Sets the monopole to be a low pass filter. (Note: This is a lower-quality filter than the biquad one.)
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 Low pass cut-off frequency.
|
|
*/
|
|
bool ndspChnIirMonoSetParamsLowPassFilter(int id, float f0);
|
|
/**
|
|
* @brief Sets the monopole to be a high pass filter. (Note: This is a lower-quality filter than the biquad one.)
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 High pass cut-off frequency.
|
|
*/
|
|
bool ndspChnIirMonoSetParamsHighPassFilter(int id, float f0);
|
|
/**
|
|
* @brief Configures whether the IIR biquad filter of a channel is enabled.
|
|
* @param id ID of the channel (0..23).
|
|
* @param enable Whether to enable the IIR biquad filter.
|
|
*/
|
|
void ndspChnIirBiquadSetEnable(int id, bool enable);
|
|
/**
|
|
* @brief Manually sets up the parameters of the biquad filter
|
|
* @param id ID of the channel (0..23).
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsCustomFilter(int id, float a0, float a1, float a2, float b0, float b1, float b2);
|
|
/**
|
|
* @brief Sets the biquad to be a low pass filter.
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 Low pass cut-off frequency.
|
|
* @param Q "Quality factor", typically should be sqrt(2)/2 (i.e. 0.7071).
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsLowPassFilter(int id, float f0, float Q);
|
|
/**
|
|
* @brief Sets the biquad to be a high pass filter.
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 High pass cut-off frequency.
|
|
* @param Q "Quality factor", typically should be sqrt(2)/2 (i.e. 0.7071).
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsHighPassFilter(int id, float f0, float Q);
|
|
/**
|
|
* @brief Sets the biquad to be a band pass filter.
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 Mid-frequency.
|
|
* @param Q "Quality factor", typically should be sqrt(2)/2 (i.e. 0.7071).
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsBandPassFilter(int id, float f0, float Q);
|
|
/**
|
|
* @brief Sets the biquad to be a notch filter.
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 Notch frequency.
|
|
* @param Q "Quality factor", typically should be sqrt(2)/2 (i.e. 0.7071).
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsNotchFilter(int id, float f0, float Q);
|
|
/**
|
|
* @brief Sets the biquad to be a peaking equalizer.
|
|
* @param id ID of the channel (0..23).
|
|
* @param f0 Central frequency.
|
|
* @param Q "Quality factor", typically should be sqrt(2)/2 (i.e. 0.7071).
|
|
* @param gain Amount of gain (raw value = 10 ^ dB/40)
|
|
*/
|
|
bool ndspChnIirBiquadSetParamsPeakingEqualizer(int id, float f0, float Q, float gain);
|
|
///@}
|