Added support to samples.cpp for volume and left/right selection for each route. Updated necessary drivers to support.
This commit is contained in:
parent
2d0d872d27
commit
f21770fa69
|
@ -381,7 +381,7 @@ static struct BurnSampleInfo GalagaSampleDesc[] = {
|
||||||
{ "bang.wav", SAMPLE_NOLOOP },
|
{ "bang.wav", SAMPLE_NOLOOP },
|
||||||
{ "bang.wav", SAMPLE_NOLOOP },
|
{ "bang.wav", SAMPLE_NOLOOP },
|
||||||
#endif
|
#endif
|
||||||
{ "", 0 }
|
{ "", 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
STD_SAMPLE_PICK(Galaga)
|
STD_SAMPLE_PICK(Galaga)
|
||||||
|
@ -847,7 +847,8 @@ static void MachineInit()
|
||||||
|
|
||||||
NamcoSoundInit(18432000 / 6 / 32);
|
NamcoSoundInit(18432000 / 6 / 32);
|
||||||
NacmoSoundSetAllRoutes(0.90 * 10.0 / 16.0, BURN_SND_ROUTE_BOTH);
|
NacmoSoundSetAllRoutes(0.90 * 10.0 / 16.0, BURN_SND_ROUTE_BOTH);
|
||||||
BurnSampleInit(80, 0);
|
BurnSampleInit(0);
|
||||||
|
BurnSampleSetAllRoutesAllSamples(0.80, BURN_SND_ROUTE_BOTH);
|
||||||
|
|
||||||
GenericTilesInit();
|
GenericTilesInit();
|
||||||
|
|
||||||
|
|
|
@ -707,7 +707,8 @@ static void MachineInit()
|
||||||
|
|
||||||
NamcoSoundInit(18432000 / 6 / 32);
|
NamcoSoundInit(18432000 / 6 / 32);
|
||||||
NacmoSoundSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
|
NacmoSoundSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
|
||||||
BurnSampleInit(80, 0);
|
BurnSampleInit(0);
|
||||||
|
BurnSampleSetAllRoutesAllSamples(0.80, BURN_SND_ROUTE_BOTH);
|
||||||
|
|
||||||
GenericTilesInit();
|
GenericTilesInit();
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
static INT32 bAddToStream = 0;
|
static INT32 bAddToStream = 0;
|
||||||
static INT32 nTotalSamples = 0;
|
static INT32 nTotalSamples = 0;
|
||||||
static INT32 nSampleSetGain = 100;
|
|
||||||
|
|
||||||
struct sample_format
|
struct sample_format
|
||||||
{
|
{
|
||||||
|
@ -21,6 +20,8 @@ struct sample_format
|
||||||
UINT8 playing;
|
UINT8 playing;
|
||||||
UINT8 loop;
|
UINT8 loop;
|
||||||
UINT8 flags;
|
UINT8 flags;
|
||||||
|
double gain[2];
|
||||||
|
INT32 output_dir[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sample_format *samples = NULL; // store samples
|
static struct sample_format *samples = NULL; // store samples
|
||||||
|
@ -88,7 +89,7 @@ static void make_raw(UINT8 *src, UINT32 len)
|
||||||
// now go through and set the gain
|
// now go through and set the gain
|
||||||
for (UINT32 i = 0; i < converted_len * 2; i++)
|
for (UINT32 i = 0; i < converted_len * 2; i++)
|
||||||
{
|
{
|
||||||
INT32 d = (data[i] * nSampleSetGain) / 100;
|
INT32 d = data[i];
|
||||||
if (d > 0x7fff) d = 0x7fff;
|
if (d > 0x7fff) d = 0x7fff;
|
||||||
if (d < -0x7fff) d = -0x7fff;
|
if (d < -0x7fff) d = -0x7fff;
|
||||||
data[i] = (INT16)d;
|
data[i] = (INT16)d;
|
||||||
|
@ -224,7 +225,7 @@ INT32 __cdecl ZipLoadOneFile(char* arcName, const char* fileName, void** Dest, I
|
||||||
char* TCHARToANSI(const TCHAR* pszInString, char* pszOutString, INT32 nOutSize);
|
char* TCHARToANSI(const TCHAR* pszInString, char* pszOutString, INT32 nOutSize);
|
||||||
#define _TtoA(a) TCHARToANSI(a, NULL, 0)
|
#define _TtoA(a) TCHARToANSI(a, NULL, 0)
|
||||||
|
|
||||||
void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample to stream?*/)
|
void BurnSampleInit(INT32 bAdd /*add sample to stream?*/)
|
||||||
{
|
{
|
||||||
DebugSnd_SamplesInitted = 1;
|
DebugSnd_SamplesInitted = 1;
|
||||||
|
|
||||||
|
@ -272,7 +273,6 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
|
||||||
if (!nEnableSamples) return;
|
if (!nEnableSamples) return;
|
||||||
|
|
||||||
bAddToStream = bAdd;
|
bAddToStream = bAdd;
|
||||||
nSampleSetGain = nGain;
|
|
||||||
nTotalSamples = 0;
|
nTotalSamples = 0;
|
||||||
|
|
||||||
struct BurnSampleInfo si;
|
struct BurnSampleInfo si;
|
||||||
|
@ -306,6 +306,11 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
|
||||||
} else {
|
} else {
|
||||||
sample_ptr->flags = SAMPLE_IGNORE;
|
sample_ptr->flags = SAMPLE_IGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1] = 1.00;
|
||||||
|
sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2] = 1.00;
|
||||||
|
sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] = BURN_SND_ROUTE_BOTH;
|
||||||
|
sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] = BURN_SND_ROUTE_BOTH;
|
||||||
|
|
||||||
if (destination) {
|
if (destination) {
|
||||||
free (destination);
|
free (destination);
|
||||||
|
@ -314,6 +319,34 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BurnSampleSetRoute(INT32 sample, INT32 nIndex, double nVolume, INT32 nRouteDir)
|
||||||
|
{
|
||||||
|
#if defined FBA_DEBUG
|
||||||
|
if (!DebugSnd_SamplesInitted) bprintf(PRINT_ERROR, _T("BurnSampleSetRoute called without init\n"));
|
||||||
|
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnSampleSetRoute called with invalid index %i\n"), nIndex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sample >= nTotalSamples) return;
|
||||||
|
|
||||||
|
sample_ptr = &samples[sample];
|
||||||
|
sample_ptr->gain[nIndex] = nVolume;
|
||||||
|
sample_ptr->output_dir[nIndex] = nRouteDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BurnSampleSetRouteAllSamples(INT32 nIndex, double nVolume, INT32 nRouteDir)
|
||||||
|
{
|
||||||
|
#if defined FBA_DEBUG
|
||||||
|
if (!DebugSnd_SamplesInitted) bprintf(PRINT_ERROR, _T("BurnSampleSetRouteAllSamples called without init\n"));
|
||||||
|
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnSampleSetRouteAllSamples called with invalid index %i\n"), nIndex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (INT32 i = 0; i < nTotalSamples; i++) {
|
||||||
|
sample_ptr = &samples[i];
|
||||||
|
sample_ptr->gain[nIndex] = nVolume;
|
||||||
|
sample_ptr->output_dir[nIndex] = nRouteDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BurnSampleExit()
|
void BurnSampleExit()
|
||||||
{
|
{
|
||||||
#if defined FBA_DEBUG
|
#if defined FBA_DEBUG
|
||||||
|
@ -336,7 +369,6 @@ void BurnSampleExit()
|
||||||
sample_ptr = NULL;
|
sample_ptr = NULL;
|
||||||
nTotalSamples = 0;
|
nTotalSamples = 0;
|
||||||
bAddToStream = 0;
|
bAddToStream = 0;
|
||||||
nSampleSetGain = 100;
|
|
||||||
|
|
||||||
DebugSnd_SamplesInitted = 0;
|
DebugSnd_SamplesInitted = 0;
|
||||||
}
|
}
|
||||||
|
@ -366,25 +398,62 @@ void BurnSampleRender(INT16 *pDest, UINT32 pLen)
|
||||||
|
|
||||||
if (loop) {
|
if (loop) {
|
||||||
if (bAddToStream == 0 && nFirstSample == 0) {
|
if (bAddToStream == 0 && nFirstSample == 0) {
|
||||||
for (INT32 j = 0; j < playlen; j++, position++) {
|
position *= 2;
|
||||||
dest[j] = data[position % length];
|
length *= 2;
|
||||||
|
INT16 *dst = (INT16*)dest;
|
||||||
|
INT16 *dat = (INT16*)data;
|
||||||
|
|
||||||
|
for (INT32 j = 0; j < playlen; j++, position+=2, dst += 2) {
|
||||||
|
INT32 nLeftSample = 0, nRightSample = 0;
|
||||||
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
nLeftSample = BURN_SND_CLIP(nLeftSample);
|
||||||
|
nRightSample = BURN_SND_CLIP(nRightSample);
|
||||||
|
|
||||||
|
dst[0] = nLeftSample;
|
||||||
|
dst[1] = nRightSample;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
position *= 2;
|
position *= 2;
|
||||||
length *= 2;
|
length *= 2;
|
||||||
INT16 *dst = (INT16*)dest;
|
INT16 *dst = (INT16*)dest;
|
||||||
INT16 *dat = (INT16*)data;
|
INT16 *dat = (INT16*)data;
|
||||||
|
|
||||||
for (INT32 j = 0; j < playlen; j++, position+=2, dst += 2) {
|
for (INT32 j = 0; j < playlen; j++, position+=2, dst += 2) {
|
||||||
INT32 t0 = dst[0] + dat[(position + 0) % length];
|
INT32 nLeftSample = 0, nRightSample = 0;
|
||||||
INT32 t1 = dst[1] + dat[(position + 1) % length];
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
if (t0 > 0x7fff) t0 = 0x7fff;
|
nLeftSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
if (t1 > 0x7fff) t1 = 0x7fff;
|
}
|
||||||
if (t0 < -0x7fff) t0 = -0x7fff;
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
if (t1 < -0x7fff) t1 = -0x7fff;
|
nRightSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
dst[0] = t0;
|
}
|
||||||
dst[1] = t1;
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
nLeftSample = BURN_SND_CLIP(nLeftSample + dst[0]);
|
||||||
|
nRightSample = BURN_SND_CLIP(nRightSample + dst[1]);
|
||||||
|
|
||||||
|
dst[0] = nLeftSample;
|
||||||
|
dst[1] = nRightSample;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -399,25 +468,60 @@ void BurnSampleRender(INT16 *pDest, UINT32 pLen)
|
||||||
|
|
||||||
data += position;
|
data += position;
|
||||||
if (playlen > length) playlen = length;
|
if (playlen > length) playlen = length;
|
||||||
|
|
||||||
if (bAddToStream == 0 && nFirstSample == 0) {
|
if (bAddToStream == 0 && nFirstSample == 0) {
|
||||||
for (INT32 j = 0; j < playlen; j++) {
|
INT16 *dst = (INT16*)dest;
|
||||||
dest[j] = data[j];
|
INT16 *dat = (INT16*)data;
|
||||||
|
|
||||||
|
for (INT32 j = 0; j < playlen; j++, dst +=2, dat+=2) {
|
||||||
|
INT32 nLeftSample = 0, nRightSample = 0;
|
||||||
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
nLeftSample = BURN_SND_CLIP(nLeftSample);
|
||||||
|
nRightSample = BURN_SND_CLIP(nRightSample);
|
||||||
|
|
||||||
|
dst[0] = nLeftSample;
|
||||||
|
dst[1] = nRightSample;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
INT16 *dst = (INT16*)dest;
|
INT16 *dst = (INT16*)dest;
|
||||||
INT16 *dat = (INT16*)data;
|
INT16 *dat = (INT16*)data;
|
||||||
|
|
||||||
for (INT32 j = 0; j < playlen; j++, dst +=2, dat+=2) {
|
for (INT32 j = 0; j < playlen; j++, dst +=2, dat+=2) {
|
||||||
INT32 t0 = dst[0] + dat[0];
|
INT32 nLeftSample = 0, nRightSample = 0;
|
||||||
INT32 t1 = dst[1] + dat[1];
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
if (t0 > 0x7fff) t0 = 0x7fff;
|
nLeftSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
if (t1 > 0x7fff) t1 = 0x7fff;
|
}
|
||||||
if (t0 < -0x7fff) t0 = -0x7fff;
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
if (t1 < -0x7fff) t1 = -0x7fff;
|
nRightSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
|
||||||
dst[0] = t0;
|
}
|
||||||
dst[1] = t1;
|
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
|
nLeftSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||||
|
nRightSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
nLeftSample = BURN_SND_CLIP(nLeftSample + dst[0]);
|
||||||
|
nRightSample = BURN_SND_CLIP(nRightSample + dst[1]);
|
||||||
|
|
||||||
|
dst[0] = nLeftSample;
|
||||||
|
dst[1] = nRightSample;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,22 @@ void BurnSampleSetPosition(INT32 sample, UINT32 position);
|
||||||
|
|
||||||
void BurnSampleReset();
|
void BurnSampleReset();
|
||||||
|
|
||||||
void BurnSampleInit(INT32 nGain, INT32 bAdd);
|
void BurnSampleInit(INT32 bAdd);
|
||||||
|
void BurnSampleSetRoute(INT32 sample, INT32 nIndex, double nVolume, INT32 nRouteDir);
|
||||||
|
void BurnSampleSetRouteAllSamples(INT32 nIndex, double nVolume, INT32 nRouteDir);
|
||||||
|
|
||||||
INT32 BurnSampleScan(INT32 nAction, INT32 *pnMin);
|
INT32 BurnSampleScan(INT32 nAction, INT32 *pnMin);
|
||||||
|
|
||||||
void BurnSampleRender(INT16 *pDest, UINT32 pLen);
|
void BurnSampleRender(INT16 *pDest, UINT32 pLen);
|
||||||
void BurnSampleExit();
|
void BurnSampleExit();
|
||||||
|
|
||||||
|
#define BURN_SND_SAMPLE_ROUTE_1 0
|
||||||
|
#define BURN_SND_SAMPLE_ROUTE_2 1
|
||||||
|
|
||||||
|
#define BurnSampleSetAllRoutes(i, v, d) \
|
||||||
|
BurnSampleSetRoute(i, BURN_SND_SAMPLE_ROUTE_1, v, d); \
|
||||||
|
BurnSampleSetRoute(i, BURN_SND_SAMPLE_ROUTE_2, v, d);
|
||||||
|
|
||||||
|
#define BurnSampleSetAllRoutesAllSamples(v, d) \
|
||||||
|
BurnSampleSetRouteAllSamples(BURN_SND_SAMPLE_ROUTE_1, v, d); \
|
||||||
|
BurnSampleSetRouteAllSamples(BURN_SND_SAMPLE_ROUTE_2, v, d);
|
||||||
|
|
Loading…
Reference in New Issue