From 50763c6e642086eef9a1cbfda4780411a31d6da9 Mon Sep 17 00:00:00 2001 From: Alexandre Lision <alexandre.lision@savoirfairelinux.com> Date: Tue, 2 Feb 2016 14:19:12 -0500 Subject: [PATCH] coreaudio: refactor output callback AudioLayer contains generic procedure to get AudioSamples and resample them. We can remove duplicated code in CoreLayer Change-Id: I3c756a1ff71e96a277b3b86552aa8912c05abb90 Tuleap: #324 --- src/media/audio/coreaudio/corelayer.cpp | 78 +++---------------------- 1 file changed, 8 insertions(+), 70 deletions(-) diff --git a/src/media/audio/coreaudio/corelayer.cpp b/src/media/audio/coreaudio/corelayer.cpp index 44258b4f75..fe4b5613c9 100644 --- a/src/media/audio/coreaudio/corelayer.cpp +++ b/src/media/audio/coreaudio/corelayer.cpp @@ -285,80 +285,18 @@ void CoreLayer::write(AudioUnitRenderActionFlags* ioActionFlags, UInt32 inNumberFrames, AudioBufferList* ioData) { - // Checks for resampling - AudioFormat mainBufferAudioFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); - bool resample = audioFormat_.sample_rate != mainBufferAudioFormat.sample_rate; + auto& ringBuff = getToRing(audioFormat_, inNumberFrames); + auto& playBuff = getToPlay(audioFormat_, inNumberFrames); - unsigned urgentFramesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID); - - if (urgentFramesToGet > 0) { - RING_WARN("Getting urgent frames."); - size_t totSample = std::min(inNumberFrames, urgentFramesToGet); - - playbackBuff_.setFormat(audioFormat_); - playbackBuff_.resize(totSample); - urgentRingBuffer_.get(playbackBuff_, RingBufferPool::DEFAULT_ID); - - playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); + auto& toPlay = ringBuff.frames() > 0 ? ringBuff : playBuff; + if (toPlay.frames() == 0) { for (int i = 0; i < audioFormat_.nb_channels; ++i) - playbackBuff_.channelToFloat((Float32*)ioData->mBuffers[i].mData, i); // Write - - Manager::instance().getRingBufferPool().discard(totSample, RingBufferPool::DEFAULT_ID); + memset((Float32*)ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize); } - - unsigned normalFramesToGet = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID); - - if (normalFramesToGet > 0) { - - double resampleFactor = 1.0; - unsigned readableSamples = inNumberFrames; - - if (resample) { - resampleFactor = static_cast<double>(audioFormat_.sample_rate) / mainBufferAudioFormat.sample_rate; - readableSamples = std::ceil(inNumberFrames / resampleFactor); - } - readableSamples = std::min(readableSamples, normalFramesToGet); - size_t nResampled = (double) readableSamples * resampleFactor; - - playbackBuff_.setFormat(mainBufferAudioFormat); - playbackBuff_.resize(readableSamples); - Manager::instance().getRingBufferPool().getData( - playbackBuff_, RingBufferPool::DEFAULT_ID); - playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); - - if (resample) { - AudioBuffer resampledOutput(readableSamples, audioFormat_); - resampler_->resample(playbackBuff_, resampledOutput); - - for (int i = 0; i < audioFormat_.nb_channels; ++i) - resampledOutput.channelToFloat((Float32*)ioData->mBuffers[i].mData, i); - - } else { - for (int i = 0; i < audioFormat_.nb_channels; ++i) - playbackBuff_.channelToFloat((Float32*)ioData->mBuffers[i].mData, i); - } - } - - if (normalFramesToGet <= 0) { - AudioLoop* tone = Manager::instance().getTelephoneTone(); - AudioLoop* file_tone = Manager::instance().getTelephoneFile(); - - playbackBuff_.setFormat(audioFormat_); - playbackBuff_.resize(inNumberFrames); - - if (tone) { - tone->getNext(playbackBuff_, playbackGain_); - } - else if (file_tone) { - file_tone->getNext(playbackBuff_, playbackGain_); - } - else { - playbackBuff_.reset(); - } - for (int i = 0; i < audioFormat_.nb_channels; ++i) { - playbackBuff_.channelToFloat((Float32*)ioData->mBuffers[i].mData, i); - } + else { + for (int i = 0; i < audioFormat_.nb_channels; ++i) + toPlay.channelToFloat((Float32*)ioData->mBuffers[i].mData, i); } } -- GitLab