mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 08:52:00 +00:00
Audiolib: Clean up samples handling
git-svn-id: https://svn.eduke32.com/eduke32@7683 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
f92ec7bb89
commit
19a5e86a35
4 changed files with 45 additions and 36 deletions
|
@ -233,7 +233,8 @@ FLAC__StreamDecoderWriteStatus write_flac_stream(const FLAC__StreamDecoder *deco
|
||||||
(FLAC__uint64)(uintptr_t)voice->LoopStart, (FLAC__uint64)(uintptr_t)voice->LoopEnd);
|
(FLAC__uint64)(uintptr_t)voice->LoopStart, (FLAC__uint64)(uintptr_t)voice->LoopEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
voice->length = ((samples * (voice->bits / 8)) / 2) << voice->bits;
|
size_t const size = samples * voice->channels * (voice->bits / 8);
|
||||||
|
|
||||||
voice->position = 0;
|
voice->position = 0;
|
||||||
voice->BlockLength = 0;
|
voice->BlockLength = 0;
|
||||||
// CODEDUP multivoc.c MV_SetVoicePitch
|
// CODEDUP multivoc.c MV_SetVoicePitch
|
||||||
|
@ -241,22 +242,18 @@ FLAC__StreamDecoderWriteStatus write_flac_stream(const FLAC__StreamDecoder *deco
|
||||||
voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale;
|
voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale;
|
||||||
MV_SetVoiceMixMode(voice);
|
MV_SetVoiceMixMode(voice);
|
||||||
|
|
||||||
{
|
char * block = fd->block;
|
||||||
const size_t size = samples * voice->channels * (voice->bits / 8);
|
|
||||||
if (size > fd->blocksize)
|
if (size > fd->blocksize)
|
||||||
{
|
{
|
||||||
fd->blocksize = size;
|
block = (char *)malloc(size);
|
||||||
fd->block = (char *)realloc(fd->block, sizeof(char) * size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fd->block)
|
if (block == nullptr)
|
||||||
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
|
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
|
||||||
|
}
|
||||||
voice->sound = fd->block;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
char *obuffer = fd->block;
|
char *obuffer = block;
|
||||||
FLAC__uint64 sample;
|
FLAC__uint64 sample;
|
||||||
uint8_t channel;
|
uint8_t channel;
|
||||||
|
|
||||||
|
@ -274,6 +271,17 @@ FLAC__StreamDecoderWriteStatus write_flac_stream(const FLAC__StreamDecoder *deco
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
voice->sound = block;
|
||||||
|
voice->length = samples << 16;
|
||||||
|
|
||||||
|
if (block != fd->block)
|
||||||
|
{
|
||||||
|
char * oldblock = fd->block;
|
||||||
|
fd->block = block;
|
||||||
|
fd->blocksize = size;
|
||||||
|
free(oldblock);
|
||||||
|
}
|
||||||
|
|
||||||
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -301,12 +301,12 @@ static playbackstatus MV_GetNextVorbisBlock(VoiceNode *voice)
|
||||||
vd->lastbitstream = bitstream;
|
vd->lastbitstream = bitstream;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytesread /= 2 * voice->channels;
|
uint32_t const samples = bytesread / ((voice->bits/8) * voice->channels);
|
||||||
|
|
||||||
voice->position = 0;
|
voice->position = 0;
|
||||||
voice->sound = vd->block;
|
voice->sound = vd->block;
|
||||||
voice->BlockLength = 0;
|
voice->BlockLength = 0;
|
||||||
voice->length = bytesread << 16; // ???: Should the literal 16 be voice->bits?
|
voice->length = samples << 16;
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
// If libtremor had the three additional ov_read() parameters that libvorbis has,
|
// If libtremor had the three additional ov_read() parameters that libvorbis has,
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
#define kNumOfSGs 18
|
#define kNumOfSGs 18
|
||||||
#define TTYWidth 80
|
#define TTYWidth 80
|
||||||
|
|
||||||
|
#define kBufSize (kNumOfSGs*kNumOfSamples*(16/8))
|
||||||
|
#define kSamplesMono (kNumOfSGs*kNumOfSamples)
|
||||||
|
#define kSamplesStereo (kNumOfSGs*kNumOfSamples/2)
|
||||||
|
|
||||||
/* ADPCM */
|
/* ADPCM */
|
||||||
#define XA_DATA_START (0x44-48)
|
#define XA_DATA_START (0x44-48)
|
||||||
|
|
||||||
|
@ -41,8 +45,7 @@ typedef struct {
|
||||||
double t1_x, t2_x;
|
double t1_x, t2_x;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int8_t *block;
|
int8_t block[kBufSize];
|
||||||
size_t blocksize;
|
|
||||||
|
|
||||||
VoiceNode *owner;
|
VoiceNode *owner;
|
||||||
} xa_data;
|
} xa_data;
|
||||||
|
@ -153,7 +156,7 @@ static void decodeSoundSectMono(XASector *ssct, xa_data * xad)
|
||||||
#else
|
#else
|
||||||
double tmp2, tmp3, tmp4, tmp5;
|
double tmp2, tmp3, tmp4, tmp5;
|
||||||
#endif
|
#endif
|
||||||
int8_t decodeBuf[kNumOfSGs*kNumOfSamples*2];
|
int8_t decodeBuf[kBufSize];
|
||||||
|
|
||||||
for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++)
|
for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++)
|
||||||
{
|
{
|
||||||
|
@ -187,11 +190,7 @@ static void decodeSoundSectMono(XASector *ssct, xa_data * xad)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count > xad->blocksize)
|
memcpy(xad->block, decodeBuf, kBufSize);
|
||||||
xad->block = (int8_t *)Xrealloc(xad->block, count);
|
|
||||||
|
|
||||||
memcpy(xad->block, decodeBuf, count);
|
|
||||||
xad->blocksize = count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decodeSoundSectStereo(XASector *ssct, xa_data * xad)
|
static void decodeSoundSectStereo(XASector *ssct, xa_data * xad)
|
||||||
|
@ -207,7 +206,7 @@ static void decodeSoundSectStereo(XASector *ssct, xa_data * xad)
|
||||||
#else
|
#else
|
||||||
double tmp2, tmp3, tmp4, tmp5;
|
double tmp2, tmp3, tmp4, tmp5;
|
||||||
#endif
|
#endif
|
||||||
int8_t decodeBuf[kNumOfSGs*kNumOfSamples*2];
|
int8_t decodeBuf[kBufSize];
|
||||||
|
|
||||||
for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++)
|
for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++)
|
||||||
{
|
{
|
||||||
|
@ -267,11 +266,7 @@ static void decodeSoundSectStereo(XASector *ssct, xa_data * xad)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count > xad->blocksize)
|
memcpy(xad->block, decodeBuf, kBufSize);
|
||||||
xad->block = (int8_t *)Xrealloc(xad->block, count);
|
|
||||||
|
|
||||||
memcpy(xad->block, decodeBuf, count);
|
|
||||||
xad->blocksize = count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MV_GetXAPosition(VoiceNode *voice)
|
int32_t MV_GetXAPosition(VoiceNode *voice)
|
||||||
|
@ -333,13 +328,21 @@ static playbackstatus MV_GetNextXABlock
|
||||||
voice->FixedPointBufferSize = ( voice->RateScale * MV_MIXBUFFERSIZE ) - voice->RateScale;
|
voice->FixedPointBufferSize = ( voice->RateScale * MV_MIXBUFFERSIZE ) - voice->RateScale;
|
||||||
MV_SetVoiceMixMode( voice );
|
MV_SetVoiceMixMode( voice );
|
||||||
|
|
||||||
|
uint32_t samples;
|
||||||
|
|
||||||
if (voice->channels == 2)
|
if (voice->channels == 2)
|
||||||
|
{
|
||||||
decodeSoundSectStereo(&ssct, xad);
|
decodeSoundSectStereo(&ssct, xad);
|
||||||
|
samples = kSamplesStereo;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
decodeSoundSectMono(&ssct, xad);
|
decodeSoundSectMono(&ssct, xad);
|
||||||
|
samples = kSamplesMono;
|
||||||
|
}
|
||||||
|
|
||||||
voice->sound = (char *)xad->block;
|
voice->sound = (char *)xad->block;
|
||||||
voice->length = (((xad->blocksize * (voice->bits/8))/2)<<voice->bits) / 4;
|
voice->length = samples << 16;
|
||||||
voice->position = 0;
|
voice->position = 0;
|
||||||
voice->BlockLength = 0;
|
voice->BlockLength = 0;
|
||||||
|
|
||||||
|
@ -431,11 +434,8 @@ int32_t MV_PlayXA(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend
|
||||||
xad->ptr = ptr;
|
xad->ptr = ptr;
|
||||||
xad->pos = XA_DATA_START;
|
xad->pos = XA_DATA_START;
|
||||||
xad->t1 = xad->t2 = xad->t1_x = xad->t2_x = 0;
|
xad->t1 = xad->t2 = xad->t1_x = xad->t2_x = 0;
|
||||||
xad->blocksize = 0;
|
|
||||||
xad->length = length;
|
xad->length = length;
|
||||||
|
|
||||||
xad->block = NULL;
|
|
||||||
|
|
||||||
// Request a voice from the voice pool
|
// Request a voice from the voice pool
|
||||||
voice = MV_AllocVoice( priority );
|
voice = MV_AllocVoice( priority );
|
||||||
if ( voice == NULL )
|
if ( voice == NULL )
|
||||||
|
@ -483,7 +483,6 @@ void MV_ReleaseXAVoice( VoiceNode * voice )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(xad->block);
|
|
||||||
free(xad);
|
free(xad);
|
||||||
|
|
||||||
voice->rawdataptr = 0;
|
voice->rawdataptr = 0;
|
||||||
|
|
|
@ -51,9 +51,11 @@ static playbackstatus MV_GetNextXMPBlock(VoiceNode *voice)
|
||||||
|
|
||||||
xmpd->time = mi.time;
|
xmpd->time = mi.time;
|
||||||
|
|
||||||
|
uint32_t const samples = mi.buffer_size / (2 * (16/8)); // since 2-channel, 16-bit is hardcoded
|
||||||
|
// uint32_t const samples = mi.buffer_size / (voice->channels * (voice->bits / 8));
|
||||||
|
|
||||||
voice->sound = (char const *)mi.buffer;
|
voice->sound = (char const *)mi.buffer;
|
||||||
voice->length = mi.buffer_size << 14; // since 2-channel, 16-bit is hardcoded
|
voice->length = samples << 16;
|
||||||
// voice->length = (mi.buffer_size << 16) / (voice->channels * (voice->bits >> 3));
|
|
||||||
voice->position = 0;
|
voice->position = 0;
|
||||||
voice->BlockLength = 0;
|
voice->BlockLength = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue