mirror of
https://github.com/PrimeDecomp/prime.git
synced 2026-07-12 18:18:56 -07:00
115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
#ifndef _CDSPSTREAM
|
|
#define _CDSPSTREAM
|
|
|
|
#include "types.h"
|
|
|
|
#include "dolphin/dvd.h"
|
|
|
|
struct dspadpcm_header {
|
|
uint x0_numSamples;
|
|
uint x4_numNibbles;
|
|
uint x8_sampleRate;
|
|
ushort xc_loopFlag;
|
|
ushort xe_format;
|
|
uint x10_loopStartNibble;
|
|
uint x14_loopEndNibble;
|
|
uint x18_currentAddress;
|
|
short x1c_coef[8][2];
|
|
short x3c_gain;
|
|
short x3e_predScale;
|
|
short x40_hist1;
|
|
short x42_hist2;
|
|
short x44_loopPredScale;
|
|
short x46_loopHist1;
|
|
short x48_loopHist2;
|
|
ushort x4a_pad[11];
|
|
};
|
|
CHECK_SIZEOF(dspadpcm_header, 0x60);
|
|
|
|
struct SStreamInfo {
|
|
const char* x0_fileName;
|
|
ushort x4_sampleRate;
|
|
ushort x6_pad;
|
|
uint x8_headerSize;
|
|
uint xc_adpcmBytes;
|
|
bool x10_loopFlag;
|
|
uchar x11_pad[3];
|
|
uint x14_loopStartByte;
|
|
uint x18_loopEndByte;
|
|
short x1c_coef[8][2];
|
|
};
|
|
CHECK_SIZEOF(SStreamInfo, 0x3C);
|
|
|
|
class CDSPStream {
|
|
public:
|
|
static void ReadCompleted(s32 result, DVDFileInfo* fileInfo);
|
|
|
|
int InitializeStream();
|
|
static u32 UpdateStream(void* dest, u32 destOffset, void* src, u32 len, u32 user);
|
|
void BufferStream();
|
|
void StopStream();
|
|
|
|
static uint IsStreamAvailable(int handle);
|
|
static uint IsStreamActive(int handle);
|
|
static void UpdateVolume(int handle, int vol);
|
|
void UpdateStreamVolume(int vol);
|
|
|
|
static void Silence(int handle);
|
|
void SilenceStream();
|
|
|
|
static int AllocateStereo(const SStreamInfo& leftInfo, const SStreamInfo& rightInfo, char vol,
|
|
int oneshot);
|
|
void DeallocateStream();
|
|
static int AllocateMono(const SStreamInfo& info, char vol, char pan, int oneshot);
|
|
uint AllocateStream(const SStreamInfo& info, char vol, char pan);
|
|
|
|
static void FreeAllStreams(int unused);
|
|
static void Initialize();
|
|
|
|
private:
|
|
void DoAllocateStream();
|
|
static int FindStreamIdx(int handle);
|
|
static int PickFreeStream(CDSPStream*& streamOut, int oneshot);
|
|
void CloseFiles();
|
|
static void OpenFiles(const char* fileName, CDSPStream& stream);
|
|
|
|
private:
|
|
uchar x0_state;
|
|
uchar x1_oneshot;
|
|
ushort x2_pad;
|
|
uint x4_handle;
|
|
CDSPStream* x8_right;
|
|
CDSPStream* xc_left;
|
|
const char* x10_fileName;
|
|
ushort x14_sampleRate;
|
|
ushort x16_pad;
|
|
uint x18_headerSize;
|
|
uint x1c_adpcmBytes;
|
|
bool x20_loopFlag;
|
|
uchar x21_pad[3];
|
|
uint x24_loopStartByte;
|
|
uint x28_loopEndByte;
|
|
short x2c_coef[8][2];
|
|
uchar x4c_vol;
|
|
uchar x4d_pan;
|
|
ushort x4e_pad;
|
|
DVDFileInfo x50_fileInfo1;
|
|
DVDFileInfo x8c_fileInfo2;
|
|
uint xc8_streamId;
|
|
uint xcc_fileCur;
|
|
uint xd0_remaining;
|
|
void* xd4_buffer;
|
|
uint xd8_bufferBytes;
|
|
uint xdc_streamSamples;
|
|
uchar xe0_curBuffer;
|
|
uchar xe1_pad[3];
|
|
int xe4_needsPrime;
|
|
int xe8_silenced;
|
|
uchar xec_readsPending;
|
|
uchar xed_pad[3];
|
|
int xf0_stopRequested;
|
|
};
|
|
CHECK_SIZEOF(CDSPStream, 0xF4);
|
|
|
|
#endif // _CDSPSTREAM
|