123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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++;
- }
- }
- }
- }
- }
|