Files
ZHGD_Web/Assets/UniversalMediaPlayer/Scripts/Sources/AudioOutput.cs
2025-07-13 23:16:20 +08:00

140 lines
3.7 KiB
C#

using System;
using UnityEngine;
namespace UMP
{
[RequireComponent(typeof(AudioSource))]
public abstract class AudioOutput : MonoBehaviour
{
public enum AudioChannels
{
Both,
Left,
Right
};
[SerializeField]
private AudioChannels _audioChannel;
public AudioChannels AudioChannel
{
get { return _audioChannel; }
set { _audioChannel = value; }
}
private int _id;
public int Id
{
get { return _id; }
}
private AudioSource _audioSource;
public AudioSource AudioSource
{
get {
if (_audioSource == null)
_audioSource = GetComponent<AudioSource>();
return _audioSource;
}
}
private float[] _data;
internal float[] Data
{
get { return _data; }
set
{
_data = value;
if (_outputDataListener != null && _data != null)
_outputDataListener(_data, _audioChannel);
}
}
internal void Init()
{
_id = GetInstanceID();
}
public void Play()
{
if (_audioSource == null)
_audioSource = GetComponent<AudioSource>();
_audioSource.Play();
}
public void Pause()
{
if (_audioSource == null)
_audioSource = GetComponent<AudioSource>();
_audioSource.Pause();
}
public void Stop()
{
if (_audioSource == null)
_audioSource = GetComponent<AudioSource>();
_audioSource.Stop();
}
public void RemoveAllListeners()
{
if (_audioFilterReadListener != null)
{
foreach (Action<int, float[], AudioChannels> eh in _audioFilterReadListener.GetInvocationList())
_audioFilterReadListener -= eh;
}
if (_outputDataListener != null)
{
foreach (Action<float[], AudioChannels> eh in _outputDataListener.GetInvocationList())
_outputDataListener -= eh;
}
}
private event Action<float[], AudioChannels> _outputDataListener;
public event Action<float[], AudioChannels> OutputDataListener
{
add
{
_outputDataListener = (Action<float[], AudioChannels>)Delegate.Combine(_outputDataListener, value);
}
remove
{
if (_outputDataListener != null)
_outputDataListener = (Action<float[], AudioChannels>)Delegate.Remove(_outputDataListener, value);
}
}
private event Action<int, float[], AudioChannels> _audioFilterReadListener;
internal event Action<int, float[], AudioChannels> AudioFilterReadListener
{
add
{
_audioFilterReadListener = (Action<int, float[], AudioChannels>)Delegate.Combine(_audioFilterReadListener, value);
}
remove
{
if (_audioFilterReadListener != null)
_audioFilterReadListener = (Action<int, float[], AudioChannels>)Delegate.Remove(_audioFilterReadListener, value);
}
}
/// Native Unity "AudioSource" callback
private void OnAudioFilterRead(float[] data, int nbChannels)
{
if (_audioFilterReadListener != null)
_audioFilterReadListener(Id, data, _audioChannel);
}
}
}