diff --git a/src/media/audio/coreaudio/ios/corelayer.mm b/src/media/audio/coreaudio/ios/corelayer.mm index b58b712c3ea687abdc5dd7b1d123997566dafe0b..3b547ac4a8b7d7fee8b35bbc8d70cab3e1d9753b 100644 --- a/src/media/audio/coreaudio/ios/corelayer.mm +++ b/src/media/audio/coreaudio/ios/corelayer.mm @@ -226,11 +226,11 @@ CoreLayer::setupInputBus() { &inputASBD, &size)); - Float64 inSampleRate; - size = sizeof(Float64); - AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, - &size, - &inSampleRate); + AVAudioSession *session = [AVAudioSession sharedInstance]; + // Replace AudioSessionGetProperty with AVAudioSession + Float64 inSampleRate = session.sampleRate; + Float32 bufferDuration = session.IOBufferDuration; + inputASBD.mSampleRate = inSampleRate; inputASBD.mFormatID = kAudioFormatLinearPCM; inputASBD.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked; @@ -270,11 +270,6 @@ CoreLayer::setupInputBus() { &flag, sizeof(flag)); - Float32 bufferDuration; - size = sizeof(UInt32); - AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, - &size, - &bufferDuration); UInt32 bufferSizeFrames = std::round(inSampleRate_ * bufferDuration); UInt32 bufferSizeBytes = bufferSizeFrames * sizeof(Float32); size = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * inputASBD.mChannelsPerFrame); @@ -436,6 +431,31 @@ CoreLayer::read(AudioUnitRenderActionFlags* ioActionFlags, return; } + // Check if buffer is large enough for inNumberFrames + UInt32 bufferSizeFrames = captureBuff_->mBuffers[0].mDataByteSize / sizeof(Float32); + + if (inNumberFrames > bufferSizeFrames) { + // Buffer is too small, need to reallocate + JAMI_DBG("Reallocating capture buffer..."); + + UInt32 bufferSizeBytes = inNumberFrames * sizeof(Float32); + UInt32 size = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * inChannelsPerFrame_); + + rawBuff_.reset(new Byte[size + bufferSizeBytes * inChannelsPerFrame_]); + captureBuff_ = reinterpret_cast<::AudioBufferList*>(rawBuff_.get()); + captureBuff_->mNumberBuffers = inChannelsPerFrame_; + + auto bufferBasePtr = rawBuff_.get() + size; + for (UInt32 i = 0; i < captureBuff_->mNumberBuffers; ++i) { + captureBuff_->mBuffers[i].mNumberChannels = 1; + captureBuff_->mBuffers[i].mDataByteSize = bufferSizeBytes; + captureBuff_->mBuffers[i].mData = bufferBasePtr + bufferSizeBytes * i; + } + + // Update bufferSizeFrames + bufferSizeFrames = inNumberFrames; + } + // Write the mic samples in our buffer checkErr(AudioUnitRender(ioUnit_, ioActionFlags,