MonoBehaviour.OnAudioFilterRead(float[], int)
Параметры
| Параметр | Описание |
|---|---|
| данные | array of floats, содержащий аудиоданные. |
| каналы | int, в котором хранится количество каналов аудиоданных, переданных этому делегату. |
Описание
Если OnAudioFilterRead реализован, Unity вставит пользовательский фильтр в аудио цепочку DSP.
Фильтр устанавливается в том же порядке, что и фильтр MonoBehaviour скрипт показан в Inspector.
OnAudioFilterRead звуковые данные представляют собой массив с плавающими значениями в диапазоне от [-1.0f;1.0f] и содержат звук из предыдущего фильтра в цепи или из предыдущего фильтра в цепи, а также звук из предыдущего фильтра в цепи или из предыдущего фильтра в цепи. AudioClip по вопросу AudioSource. Если это первый фильтр в цепи и клип не прикреплен к источнику звука, этот фильтр будет воспроизводиться как источник звука. Таким образом, вы можете использовать фильтр как аудиоклип, процедурно генерируя аудио.
Если каналов больше одного, то данные канала переплетаются. Это означает, что каждый последовательный образец данных в массиве поступает из другого канала, пока не закончатся каналы и не будет возвращено к первому. data.Length сообщает об общем размере данных, так что, чтобы найти количество образцов на канал, делить data.Length по channels.
Если OnAudioFilterRead осуществляетсяa VU метр показан в Inspector Также измеряется время обработки фильтра, а затраченное время в миллисекундах показывается рядом с уровнем фильтрации. VU метр. Число становится красным, если фильтр занимает слишком много времени, что означает, что миксер будет голодать аудио данных.
Следует также отметить, что OnAudioFilterRead вызывается на потоке, отличном от основного потока (а именно аудио потока), так что вызов во многих Unity выполнение функций из этой функции не разрешено (если вы попытаетесь, во время выполнения появится предупреждение).
Примечание: OnAudioFilterRead не поддерживается на веб-платформе.
Дополнительные ресурсы: Аудиофильтры.
using UnityEngine;
// The code example shows how to implement a metronome that procedurally // generates the click sounds via the OnAudioFilterRead callback. // While the game is paused or suspended, this time will not be updated and sounds // playing will be paused. Therefore developers of music scheduling routines do not have // to do any rescheduling after the app is unpaused
[RequireComponent(typeof(AudioSource))] public class AudioTest : MonoBehaviour { public double bpm = 140.0F; public float gain = 0.5F; public int signatureHi = 4; public int signatureLo = 4;
private double nextTick = 0.0F; private float amp = 0.0F; private float phase = 0.0F; private double sampleRate = 0.0F; private int accent; private bool running = false;
void Start() { accent = signatureHi; double startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; }
void OnAudioFilterRead(float[] data, int channels) { if (!running) return;
double samplesPerTick = sampleRate * 60.0F / bpm * 4.0F / signatureLo; double sample = AudioSettings.dspTime * sampleRate; int dataLen = data.Length / channels;
int n = 0; while (n < dataLen) { float x = gain * amp * Mathf.Sin(phase); int i = 0; while (i < channels) { data[n * channels + i] += x; i++; } while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0F; if (++accent > signatureHi) { accent = 1; amp *= 2.0F; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3F; amp *= 0.993F; n++; } } }