I'm trying to integrate drow audio into my app and am experiencing audio distortion on iOS only. Mac desktop is fine.
When playing back audio I get a strange reverb type distortion. If I change the AudioFilePlayerExt to a AudioFilePlayer then the audio sounds perfect although I have to comment out the filter calls in the setVolume call. I really would like to use AudioFilePlayerExt because I want to have access to the SoundTouch apis.
A related question is how do you set the volume on a plain old AudioFilePlayer object? (Not Ext)
Here is my interface...
class AudioPlayer : private AudioIODeviceCallback { public: AudioPlayer(); ~AudioPlayer(); public: bool setFile(const File& file); void setVolume(double volume); void setPosition(double position); void start(); void stop(); bool isPlaying(); private: void audioDeviceAboutToStart(AudioIODevice* device); void audioDeviceStopped(); void audioDeviceIOCallback(const float** inputChannelData, int numInputChannels, float** outputChannelData, int numOutputChannels, int numSamples); private: AudioDeviceManager audioDeviceManager; AudioSourcePlayer audioSourcePlayer; AudioFilePlayerExt audioFilePlayer; BufferTransformAudioSource bufferTransformAudioSource; };
And my implementation...
AudioPlayer::AudioPlayer() : bufferTransformAudioSource(&audioFilePlayer) { audioDeviceManager.initialise(0, 2, nullptr, true); audioDeviceManager.addAudioCallback(this); audioSourcePlayer.setSource(&bufferTransformAudioSource); } AudioPlayer::~AudioPlayer() { audioDeviceManager.removeAudioCallback(this); audioSourcePlayer.setSource(nullptr); } bool setFile(const File& file) { return audioFilePlayer.setFile(file); } void AudioPlayer::setVolume(double volume) { audioFilePlayer.setFilterGain(FilteringAudioSource::Low, (float)volume); audioFilePlayer.setFilterGain(FilteringAudioSource::Mid, (float)volume); audioFilePlayer.setFilterGain(FilteringAudioSource::High, (float)volume); } void AudioPlayer::setPosition(double position) { audioFilePlayer.setPosition(position); } void AudioPlayer::start() { audioFilePlayer.start(); } void AudioPlayer::stop() { audioFilePlayer.stop(); } bool AudioPlayer::isPlaying() { return audioFilePlayer.isPlaying(); } void AudioPlayer::audioDeviceAboutToStart(AudioIODevice* device) { audioSourcePlayer.audioDeviceAboutToStart(device); } void AudioPlayer::audioDeviceStopped() { audioSourcePlayer.audioDeviceStopped(); } void AudioPlayer::audioDeviceIOCallback(const float** inputChannelData, int numInputChannels, float** outputChannelData, int numOutputChannels, int numSamples) { audioSourcePlayer.audioDeviceIOCallback(inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); }