MCPcopy Create free account
hub / github.com/LabSound/LabSound / createBySampleRateConverting

Method createBySampleRateConverting

src/core/AudioBus.cpp:678–761  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

676}
677
678std::unique_ptr<AudioBus> AudioBus::createBySampleRateConverting(const AudioBus * sourceBus, bool mixToMono, float newSampleRate)
679{
680 // sourceBus's sample-rate must be known.
681 ASSERT(sourceBus && sourceBus->sampleRate());
682
683 if (!sourceBus || !sourceBus->sampleRate())
684 {
685 return nullptr;
686 }
687
688 double sourceSampleRate = sourceBus->sampleRate();
689 float destinationSampleRate = static_cast<float>(newSampleRate);
690 double sampleRateRatio = sourceSampleRate / destinationSampleRate;
691 int numberOfSourceChannels = sourceBus->numberOfChannels();
692
693 if (numberOfSourceChannels == Channels::Mono)
694 {
695 mixToMono = false; // already mono
696 }
697
698 if (sourceSampleRate == destinationSampleRate)
699 {
700 // No sample-rate conversion is necessary.
701 if (mixToMono)
702 return AudioBus::createByMixingToMono(sourceBus);
703
704 // Return exact copy.
705 return AudioBus::createBufferFromRange(sourceBus, 0, sourceBus->length());
706 }
707
708 if (sourceBus->isSilent())
709 {
710 std::unique_ptr<AudioBus> silentBus(new AudioBus(numberOfSourceChannels, static_cast<int>(sourceBus->length() / sampleRateRatio)));
711 silentBus->setSampleRate(newSampleRate);
712 return silentBus;
713 }
714
715 // First, mix to mono (if necessary) then sample-rate convert.
716 const AudioBus * resamplerSourceBus;
717 std::unique_ptr<AudioBus> mixedMonoBus;
718 if (mixToMono)
719 {
720 mixedMonoBus = AudioBus::createByMixingToMono(sourceBus);
721 resamplerSourceBus = mixedMonoBus.get();
722 }
723 else
724 {
725 // Directly resample without down-mixing.
726 resamplerSourceBus = sourceBus;
727 }
728
729 // Calculate destination length based on the sample-rates.
730 int sourceLength = resamplerSourceBus->length();
731 int destinationLength = static_cast<int>(sourceLength / sampleRateRatio);
732
733 // Create destination bus with same number of channels.
734 int numberOfDestinationChannels = resamplerSourceBus->numberOfChannels();
735 std::unique_ptr<AudioBus> destinationBus(new AudioBus(numberOfDestinationChannels, destinationLength));

Callers

nothing calls this directly

Calls 10

getMethod · 0.80
channelMethod · 0.80
mutableDataMethod · 0.80
sampleRateMethod · 0.45
numberOfChannelsMethod · 0.45
lengthMethod · 0.45
isSilentMethod · 0.45
setSampleRateMethod · 0.45
dataMethod · 0.45
clearSilentFlagMethod · 0.45

Tested by

no test coverage detected