About internal sample rate conversion (commit d2bede24)
First of all I want to write that you have done a fantastic job. My compliments.
When Exhale operates with the switch 0 or 1 use an internal sample rate conversion and at the end of compression it reports very little differences between when it does not resample and when it resamples. The differences seem to me to be greater than the reported numbers and so I thought I'd show you some graphs.
Fraunhofer uses a sine sweep file to show the qualities of its encoder. You can find it at the following address: https://www2.iis.fraunhofer.de/AAC/Sweep20-20_20sec_-6dB_48k.wav.
Our reference file shows a logarithmic spectrum (Hann Window) visible at the following link: Sweep20-20_20sec_-6dB_48k.wav.
For the demonstration I created a second wave file resampled to 32kHz using another sample rate converter, the spectrum is visible at the following link: Sweep20-20_20sec_-6dB_32k.wav.
If I input this last wave file to Exhale, I get a very good result for the lowest bitrate, and the angle which the peak in the logarithmic spectrum decreases seems to be the same of the input file, as shown here:Sweep20-20_20sec_-6dB_32k.m4a.
Otherwise if I input the wave file sampled at 48kHz, Exhale will use the internal sample rate conversion producing a spectrum with even more unrealistic results, like those shown here: Sweep20-20_20sec_-6dB_48k.m4a.
Before doing these tests I have listened the files obtained by Exhale several times and I honestly think that Audacity, the software used to produce the graphics, has more problems than Exhale, for example the sine wave sweep which appears on the right in blue and in the background, shows a much lower effect of the low pass filter than the spectrogram in the foreground where the cut frequency shown is above 100Hz.
I suggest checking the code related to the internal sample rate conversion, anyway without it your encoder is fine. Thanks again.