diff --git a/src/media/audio/coreaudio/ios/corelayer.cpp b/src/media/audio/coreaudio/ios/corelayer.cpp index 42a2e0ae936b325b8f07098864c99130af2517ba..9704afb59de04a48a465e1c5a1cc12ac18dfeb1c 100644 --- a/src/media/audio/coreaudio/ios/corelayer.cpp +++ b/src/media/audio/coreaudio/ios/corelayer.cpp @@ -230,7 +230,7 @@ CoreLayer::setupInputBus() { inputBus, &inputASBD, &size)); - + inputASBD.mSampleRate = inSampleRate; audioInputFormat_ = {static_cast<unsigned int>(inputASBD.mSampleRate), static_cast<unsigned int>(inputASBD.mChannelsPerFrame)}; hardwareInputFormatAvailable(audioInputFormat_); @@ -262,7 +262,7 @@ CoreLayer::setupInputBus() { AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration); - UInt32 bufferSizeFrames = inSampleRate_ * bufferDuration; + UInt32 bufferSizeFrames = std::round(inSampleRate_ * bufferDuration); UInt32 bufferSizeBytes = bufferSizeFrames * sizeof(Float32); size = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * inputASBD.mChannelsPerFrame); rawBuff_.reset(new Byte[size + bufferSizeBytes * inputASBD.mChannelsPerFrame]); @@ -295,14 +295,15 @@ CoreLayer::bindCallbacks() { sizeof(AURenderCallbackStruct))); // Input callback setup - callback.inputProc = inputCallback; - callback.inputProcRefCon = this; + AURenderCallbackStruct inputCall; + inputCall.inputProc = inputCallback; + inputCall.inputProcRefCon = this; checkErr(AudioUnitSetProperty(ioUnit_, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, inputBus, - &callback, + &inputCall, sizeof(AURenderCallbackStruct))); } @@ -386,6 +387,9 @@ CoreLayer::write(AudioUnitRenderActionFlags* ioActionFlags, for (unsigned i = 0; i < frame.channels; ++i) { std::copy_n((Float32*)frame.extended_data[i], inNumberFrames, (Float32*)ioData->mBuffers[i].mData); } + } else { + for (int i = 0; i < currentOutFormat.nb_channels; ++i) + std::fill_n(reinterpret_cast<Float32*>(ioData->mBuffers[i].mData), inNumberFrames, 0); } } @@ -425,7 +429,7 @@ CoreLayer::read(AudioUnitRenderActionFlags* ioActionFlags, auto format = audioInputFormat_; format.sampleFormat = AV_SAMPLE_FMT_FLTP; - auto inBuff = std::make_unique<AudioFrame>(audioInputFormat_, inNumberFrames); + auto inBuff = std::make_unique<AudioFrame>(format, inNumberFrames); if (isCaptureMuted_) { libav_utils::fillWithSilence(inBuff->pointer()); } else {