summaryrefslogtreecommitdiff
path: root/psxdev/xadecode.h
blob: b886285d910444cd13fd3a7b15845536ff085baa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
	author: unknown, probably bitmaster?
	slightly modified by dbalster
*/

#include "generic.h"

#ifndef XADECODE_H
#define XADECODE_H

#define USE_FXD 1

#define kNumOfSamples   224
#define kNumOfSGs       18

#define XAFile			0
#define XAChannel		1
#define XAType			2
#define XAFlags			3
/* bits in XAFlags byte */
#define XAFStereo		1<<0
#define XAFHalfHz		1<<2

#define XAAUDIO		0x64
#define XAVIDEO		0x48
#define XABREAK		0xE4
#define XACURRENT	0x100	/* for application use only! */
#define XANONE		0x200	/* for application use only! */
#define XAAV		0x400	/* for application use only! */

#define max(a,b) (a<b?b:a)
#define min(a,b) (a>b?b:a)

#define FXD_FxdToPCM(dt)			(max(min((short)((dt)>>16), 32767), -32768))
#define DblToPCM(dt)				(short)(max(min((dt), 32767), -32768))

#define WHP_READ68_AUTO(fp, dt)		WHP_Read68(dt, sizeof(*(dt)), 1, fp)
#define WHP_WRITE68_AUTO(fp, dt)	WHP_Write68(dt, sizeof(*(dt)), 1, fp)

#define WHP_CNV_SHORT68(dt, ndt)	WHP_CnvEndianShort((dt), (ndt))
#define WHP_CNV_LONG68(dt, ndt)		WHP_CnvEndianLong((dt), (ndt))

#if USE_FXD
#define FXD_FxdToPcm16(dt)			(max(min((dt)/2, 32767), -32768))
#define FXD_Pcm16ToFxd(dt)			((long)dt*2)
#endif

#define XAWAVBUFSIZE (kNumOfSamples*kNumOfSGs*2)

typedef char SoundGroup[128];

typedef struct SoundSector {
	char            sectorFiller[8];
	SoundGroup      SoundGroups[kNumOfSGs];
} PACKED SoundSector;

typedef unsigned long DWORD;
typedef unsigned short WORD;

#if USE_FXD
typedef long FXD;
#endif

#ifdef __cplusplus
extern "C" {
#endif

long decodeSoundSect(SoundSector *ssct, char *wav);
long decodeSoundSect1(SoundSector *ssct, char *wav);
long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e);
void initXaDecode(void);
void switchXaDecode(int channel);
void saveXaDecode(int channel);
void reinitXaDecode(int channel);
signed char getSoundData(char *buf, long unit, long sample);
signed char getFilter(char *buf, long unit);
signed char getRange(char *buf, long unit);
char xachannel(SoundSector *ss);
unsigned char xatype(SoundSector *ss);
char xafileno(SoundSector *ss);
char xastereo(SoundSector *ss);
char xahalfhz(SoundSector *ss);

#if USE_FXD
FXD FXD_FixMul(FXD a, FXD b);
#endif

#ifdef __cplusplus
}
#endif

#endif