Просто для обсуждения я приведу класс от JUCE под названием AudioSampleBuffer . Теперь этот класс существует для хранения фрагмента (или, возможно, довольно длинного фрагмента) аудио. Он знает, что число каналов, количество выборок (на канал), кажется, соответствует 32-разрядному IEEE-плавающему, вместо того, чтобы иметь переменное числовое представление или размер слова (но это не проблема для меня). Существуют функции-члены, которые позволяют вам получать numChannels или numSamples и указатели на любой конкретный канал. Вы можете сделать AudioSampleBuffer длиннее или короче. Я предполагаю, что первые нулевые буферы буферизируют, а последние усекают.
Есть несколько закрытых членов этого класса, которые используются для выделения пространства в специальной куче, которую использует JUCE.
Но это то, чего не хватает в AudioSampleBuffer (и я несколько раз обсуждал это с Жюлем): член вызвал SampleRate
. Как это могло пропустить это?
Единственная ответственность, которую AudioSampleBuffer должен выполнить, состоит в том, чтобы адекватно представлять физическое аудио, которое слышит тот, который представляют его образцы. Когда вы вводите AudioSampleBuffer из чего-то, что читает звуковой файл или из потока, есть дополнительный параметр, который вы должны получить и передать его вместе с AudioSampleBuffer в методы обработки (скажем, это фильтр), которые должны знать частоту дискретизации или, в конце концов, к методу, который воспроизводит буфер для прослушивания (или передает его в другое место). Без разницы.
Но то, что вам нужно сделать, это продолжать передавать этот SampleRate, который присущ конкретному аудио, живущему в AudioSampleBuffer, везде и всюду. Я видел код, в котором константе 44100.0f была передана функция, потому что программист, похоже, не знал, что еще делать.
Это пример невыполнения единой обязанности.