Have FFMS2 do the audio downmixing when possible
Aegisub's downmixer is terrible for anything with more than two channels (averaging all the channels together is not even vaguely close to the correct thing to do for 5.1), so libavresample should be far better.
This commit is contained in:
parent
745b9ab2a9
commit
572a58cd90
1 changed files with 16 additions and 0 deletions
|
@ -173,6 +173,22 @@ void FFmpegSourceAudioProvider::LoadAudio(wxString filename) {
|
||||||
default:
|
default:
|
||||||
throw agi::AudioProviderOpenError("unknown or unsupported sample format", 0);
|
throw agi::AudioProviderOpenError("unknown or unsupported sample format", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if FFMS_VERSION >= ((2 << 24) | (17 << 16) | (4 << 8) | 0)
|
||||||
|
if (channels > 1 || bytes_per_sample != 2) {
|
||||||
|
std::unique_ptr<FFMS_ResampleOptions, decltype(&FFMS_DestroyResampleOptions)>
|
||||||
|
opt(FFMS_CreateResampleOptions(AudioSource), FFMS_DestroyResampleOptions);
|
||||||
|
opt->ChannelLayout = FFMS_CH_FRONT_CENTER;
|
||||||
|
opt->SampleFormat = FFMS_FMT_S16;
|
||||||
|
|
||||||
|
// Might fail if FFMS2 wasn't built with libavresample
|
||||||
|
if (!FFMS_SetOutputFormatA(AudioSource, opt.get(), nullptr)) {
|
||||||
|
channels = 1;
|
||||||
|
bytes_per_sample = 2;
|
||||||
|
float_samples = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpegSourceAudioProvider::FillBuffer(void *Buf, int64_t Start, int64_t Count) const {
|
void FFmpegSourceAudioProvider::FillBuffer(void *Buf, int64_t Start, int64_t Count) const {
|
||||||
|
|
Loading…
Reference in a new issue