Audiolib: Clean up samples handling

git-svn-id: https://svn.eduke32.com/eduke32@7683 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2019-05-27 05:45:33 +00:00 committed by Christoph Oelckers
parent f92ec7bb89
commit 19a5e86a35
4 changed files with 45 additions and 36 deletions

View file

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

View file

@ -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,

View file

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

View file

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