Added support to samples.cpp for volume and left/right selection for each route. Updated necessary drivers to support.

This commit is contained in:
Barry Harris 2012-05-24 09:46:27 +00:00
parent 2d0d872d27
commit f21770fa69
4 changed files with 152 additions and 33 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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;
} }
} }
} }

View File

@ -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);