Files
kaiju/Assets/Util/AudioSource.cs

93 lines
2.3 KiB
C#

using Assets.WasapiAudio.Scripts.Core;
using UnityEngine;
using UnityEngine.UI;
[ExecuteAlways]
public class AudioSource : MonoBehaviour {
public WasapiCaptureType CaptureType = WasapiCaptureType.Loopback;
public int SpectrumSize = 32;
public int MinFrequency = 100;
public int MaxFrequency = 20000;
public ScalingStrategy ScalingStrategy = ScalingStrategy.Sqrt;
public WasapiAudioFilter[] Filters;
public Preferences preferences;
public Texture speakerTexture;
public Texture micTexture;
private WasapiAudio _wasapiAudio;
private float[] _spectrumData;
public void Start() {
CaptureType = preferences.data.useLoopback
? WasapiCaptureType.Loopback
: WasapiCaptureType.Microphone;
// Debug.Log($"Pref: {preferences.data.useLoopback} {CaptureType}");
Initialise();
}
void Initialise() {
bool isLoopback = CaptureType == WasapiCaptureType.Loopback;
SetImageTexture(isLoopback);
_wasapiAudio?.StopListen();
_wasapiAudio = new WasapiAudio(CaptureType, SpectrumSize, ScalingStrategy, MinFrequency, MaxFrequency, Filters, spectrumData => {
_spectrumData = spectrumData;
});
_wasapiAudio.StartListen();
}
public float[] GetSpectrumData() {
return _spectrumData;
}
void OnDestroy() {
_wasapiAudio?.StopListen();
}
public void ToggleCaptureType() {
if (CaptureType == WasapiCaptureType.Loopback) {
UseMicrophone();
} else {
UseLoopback();
}
}
void UseMicrophone() {
CaptureType = WasapiCaptureType.Microphone;
preferences.SetUseLoopback(false);
try {
Initialise();
} catch {
Debug.Log("Microphone unavailable");
// prevents the StopListen check from
// running on a half initialised object
_wasapiAudio = null;
UseLoopback();
}
}
void UseLoopback() {
CaptureType = WasapiCaptureType.Loopback;
preferences.SetUseLoopback(true);
Initialise();
}
void SetImageTexture(bool useLoopback) {
RawImage image = GetComponent<RawImage>();
if (!image) return;
image.texture = useLoopback
? speakerTexture
: micTexture;
}
}