using UnityEngine; //----------------------------------------------------------------------------- // Copyright 2019-2022 RenderHeads Ltd. All rights reserved. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo { /// Allows per-channel volume control /// Currently supported on Windows and UWP (Media Foundation API only), macOS, iOS, tvOS and Android (ExoPlayer API only) [AddComponentMenu("AVPro Video/Audio Channel Mixer", 401)] [HelpURL("https://www.renderheads.com/products/avpro-video/")] public class AudioChannelMixer : MonoBehaviour { const int MaxChannels = 8; [Range(0f, 1f)] [SerializeField] float[] _channels = null; /// Range 0.0 to 1.0 public float[] Channel { get { return _channels; } set { _channels = value; } } void Reset() { _channels = new float[MaxChannels]; for (int i = 0; i < MaxChannels; i++) { _channels[i] = 1f; } } void ChangeChannelCount(int numChannels) { float[] channels = new float[numChannels]; if (_channels != null && _channels.Length != 0) { for (int i = 0; i < channels.Length; i++) { if (i < _channels.Length) { channels[i] = _channels[i]; } else { channels[i] = 1f; } } } else { for (int i = 0; i < numChannels; i++) { channels[i] = 1f; } } _channels = channels; } void OnAudioFilterRead(float[] data, int channels) { if (channels != _channels.Length) { ChangeChannelCount(channels); } int k = 0; int numSamples = data.Length / channels; for (int j = 0; j < numSamples; j++) { for (int i = 0; i < channels; i++) { data[k] *= _channels[i]; k++; } } } } }