DSiDsp/arm9/source/libdsp/CtrDspProcess.cpp
Gericom a5bd5afc96 Added 3DS dsp1 loading and implemented an aac decoding example
It still doesn't want to read from main memory though
2019-11-11 12:36:07 +01:00

79 lines
2.4 KiB
C++

#include <nds.h>
#include "dsp.h"
#include "dsp_pipe.h"
#include "CtrDspProcess.h"
void CtrDspProcess::OnPipeResponse(int port, int dir)
{
if(dir != DSP_PIPE_DIR_IN)
return;
dsp_pipe_t pipe;
dsp_loadPipe(&pipe, port, dir);
if(dsp_getPipeReadLength(&pipe) < sizeof(dsp_codec_cmd_t))
return;
dsp_readPipe(&pipe, (void*)&_lastResponse, sizeof(dsp_codec_cmd_t));
if(_lastResponse.codecType == DSP_CODEC_TYPE_AACDEC && _lastResponse.command == DSP_CODEC_CMD_PROCESS)
{
memcpy(&_lastAACDecResponse, &_lastResponse.params.aacDecProcResp, sizeof(dsp_codec_cmd_aacdec_proc_resp_t));
_lastAACDecResponseValid = true;
}
_gotResponse = true;
}
bool CtrDspProcess::AACDecInitialize(
DspCodecAACDecFormat format,
DspCodecAACDecFrequency frequency,
DspCodecAACDecCRCFlag crcFlag,
DspCodecAACDecReverseFlag reverseFlag)
{
dsp_setPipePortCallback(DSP_PIPE_PORT_BINARY, CtrDspProcess::OnPipeResponse, this);
dsp_pipe_t pipe;
dsp_loadPipe(&pipe, DSP_PIPE_PORT_BINARY, DSP_PIPE_DIR_OUT);
dsp_codec_cmd_t cmd;
cmd.codecType = DSP_CODEC_TYPE_AACDEC;
cmd.command = DSP_CODEC_CMD_INITIALIZE;
cmd.result = DSP_CODEC_RESULT_SUCCESS;
cmd.platform = 0;
cmd.params.aacDecInit.format = format;
cmd.params.aacDecInit.frequency = frequency;
cmd.params.aacDecInit.crcFlag = crcFlag;
cmd.params.aacDecInit.reverseFlag = reverseFlag;
cmd.params.aacDecInit.reserved = 0;
_gotResponse = false;
_lastAACDecResponseValid = false;
dsp_writePipe(&pipe, &cmd, sizeof(cmd));
WaitCodecResponse();
return _lastResponse.result == DSP_CODEC_RESULT_SUCCESS;
}
void CtrDspProcess::AACDecDecode(const void* aacFrame, u32 frameLength, s16* leftOut, s16* rightOut)
{
dsp_setPipePortCallback(DSP_PIPE_PORT_BINARY, CtrDspProcess::OnPipeResponse, this);
dsp_pipe_t pipe;
dsp_loadPipe(&pipe, DSP_PIPE_PORT_BINARY, DSP_PIPE_DIR_OUT);
dsp_codec_cmd_t cmd;
cmd.codecType = DSP_CODEC_TYPE_AACDEC;
cmd.command = DSP_CODEC_CMD_PROCESS;
cmd.result = DSP_CODEC_RESULT_SUCCESS;
cmd.platform = 0;
cmd.params.aacDecProc.dataAddress = (u32)aacFrame;
cmd.params.aacDecProc.frameSize = frameLength;
cmd.params.aacDecProc.leftPCMAddress = (u32)leftOut;
cmd.params.aacDecProc.rightPCMAddress = (u32)rightOut;
cmd.params.aacDecProc.paramAddress = 0;
_gotResponse = false;
dsp_writePipe(&pipe, &cmd, sizeof(cmd));
}