не могу найти переменную OfflineAudioContext в сафари

Что касается примера кода в вопросе, стандартное решение должно явно ссылаться на класс по его имени, и даже можно обойтись без вызова getClassLoader():

class MyClass {
  public static void startMusic() {
    URL songPath = MyClass.class.getResource("background.midi");
  }
}

Этот подход все еще имеет обратную сторону, что он не очень безопасен в отношении ошибок копирования / вставки, если вам нужно скопировать этот код на ряд подобных классов.

А что касается точного вопроса в заголовке, трюк, отправленный в соседний поток :

Class currentClass = new Object() { }.getClass().getEnclosingClass();

Он использует вложенный анонимный подкласс Object, чтобы получить контекст выполнения. Этот трюк имеет преимущество в том, что он является безопасным для копирования / вставки ...

Внимание при использовании этого в базовом классе, который наследуют другие классы:

Также стоит отметить, что если это фрагмент имеет форму статического метода некоторого базового класса, тогда значение currentClass всегда будет ссылкой на этот базовый класс, а не на любой подкласс, который может использовать этот метод.

0
задан Ron Daulagupu 6 March 2019 в 10:45
поделиться

1 ответ

Это немного сбивает с толку, но Safari бросает SyntaxError, если ему не нравятся аргументы. И, к сожалению, Safari не нравится широкий спектр аргументов, которые обычно должны поддерживаться.

Насколько я знаю, Safari принимает только первый параметр от 1 до 10. Это параметр для numberOfChannels.

Второй параметр (length) просто должен быть положительным.

sampleRate может быть числом от 44100 до 96000.

Однако можно перевести все вычисления с 16 кГц в другой sampleRate, который затем работает в Safari. Допустим, это вычисление, которое вы хотели бы выполнить при 16 кГц:

const oac = new OfflineAudioContext(1, 10, 16000);
const osciallator = oac.createOscillator();

osciallator.frequency.value = 400;

osciallator.connect(oac.destination);
osciallator.start(0);

oac.startRendering()
    .then((renderedBuffer) => {
        console.log(renderedBuffer.sampleRate);
        console.log(renderedBuffer.getChannelData(0));
    });

Вы можете сделать почти то же самое при 48 кГц. Только sampleRate будет другим, но channelData отрендеренного AudioBuffer будет таким же.

const oac = new webkitOfflineAudioContext(1, 10, 48000);
const osciallator = oac.createOscillator();

osciallator.frequency.value = 1200;

osciallator.connect(oac.destination);
osciallator.start(0);

oac.oncomplete = (event) => {
    console.log(event.renderedBuffer.sampleRate);
    console.log(event.renderedBuffer.getChannelData(0));
};
oac.startRendering();

В сторону: поскольку я являюсь автором стандартизированного аудио-контекста , который представляет собой библиотеку, которая пытается устранить несоответствия между реализациями браузера, я должен упомянуть об этом здесь. :-) Это не поможет с ограничениями параметров в Safari, но, по крайней мере, выдаст ожидаемую ошибку, если параметр выходит за пределы диапазона.

Также обратите внимание, что length не зависит от numberOfChannels. Если IfsourceAudioBuffer.duration в вашем примере - это длительность в секундах, то вам просто нужно умножить ее на TARGET_SAMPLE_RATE, чтобы получить желаемое length.

0
ответ дан chrisguttandin 6 March 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: