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(); if (!image) return; image.texture = useLoopback ? speakerTexture : micTexture; } }