Bink: remove redundant audio info from binkMovie

Read the sample rate and number of channels from individual audio frames.
This commit is contained in:
Timotej Lazar 2020-06-03 12:55:41 +02:00
parent cb72993765
commit 5b9a0e939c

View file

@ -51,9 +51,7 @@ struct binkMovie {
AVCodecContext* audioContext;
BOOL alInited;
ALuint alSource;
ALuint alNumChannels;
ALenum alFormat;
ALuint alSampleRate;
// Decoded audio frame queue.
ALuint audioFrames[AUDIO_FRAMES];
@ -186,31 +184,25 @@ static int DecodeAudioFrame(struct binkMovie* aMovie)
case AV_CH_LAYOUT_MONO:
aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ?
AL_FORMAT_MONO8 : AL_FORMAT_MONO16;
aMovie->alNumChannels = 1;
break;
case AV_CH_LAYOUT_STEREO:
aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ?
AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16;
aMovie->alNumChannels = 2;
break;
}
aMovie->alSampleRate = aMovie->audioFrame->sample_rate;
aMovie->audioTempBuffer =
malloc(aMovie->alNumChannels * aMovie->audioFrame->nb_samples * 2 * 2);
malloc(aMovie->audioFrame->channels * aMovie->audioFrame->nb_samples * 2 * 2);
aMovie->alInited = TRUE;
}
if (aMovie->alNumChannels == 0)
return 0;
if (aMovie->alNumFreeBuffers == 0)
return 0;
// queue this frame
ALuint alBuffer = aMovie->alFreeBuffers[aMovie->alNumFreeBuffers-1];
int sampleCount = aMovie->audioFrame->nb_samples * aMovie->alNumChannels;
int sampleCount = aMovie->audioFrame->nb_samples * aMovie->audioFrame->channels;
uint dataSize = sampleCount * 2; // 16bit is deafult
void* data = (void*)aMovie->audioFrame->extended_data[0];
@ -254,20 +246,20 @@ static int DecodeAudioFrame(struct binkMovie* aMovie)
data = (void*)aMovie->audioTempBuffer;
short* tempBuf = (short*)aMovie->audioTempBuffer;
for (int i = 0; i < aMovie->audioFrame->nb_samples; i++) {
for (int j = 0; j < aMovie->alNumChannels; j++) {
for (int j = 0; j < aMovie->audioFrame->channels; j++) {
float* srcBuf = (float*)aMovie->audioFrame->extended_data[j];
float val = srcBuf[i] * 32768;
if (val > 32767)
val = 32767;
if (val < -32768)
val = -32768;
tempBuf[(i*aMovie->alNumChannels)+j] = (short)val;
tempBuf[(i*aMovie->audioFrame->channels)+j] = (short)val;
}
}
} break;
}
alBufferData(alBuffer, aMovie->alFormat, data, dataSize - 16, aMovie->alSampleRate);
alBufferData(alBuffer, aMovie->alFormat, data, dataSize - 16, aMovie->audioFrame->sample_rate);
AL_CHECK();
alSourceQueueBuffers(aMovie->alSource, 1, &alBuffer);