| 676 | } |
| 677 | |
| 678 | std::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)); |
nothing calls this directly
no test coverage detected