using System;
using Adrenak.UniMic;
using UnityEngine;
namespace Adrenak.UniVoice.Inputs {
///
/// An implementation based on UniMic.
/// For more on UniMic, visit https://www.github.com/adrenak/unimic
///
public class UniMicInput : IAudioInput {
const string TAG = "UniMicInput";
public event Action OnFrameReady;
public Mic.Device device;
public Mic.Device Device {
get => device;
set {
if (device == value)
return;
if(device != null)
device.OnFrameCollected -= OnFrameCollected;
device = value;
if(device != null)
device.OnFrameCollected += OnFrameCollected;
}
}
public UniMicInput(Mic.Device device) {
Device = device;
}
private void OnFrameCollected(int frequency, int channels, float[] samples) {
var frame = new AudioFrame {
timestamp = 0,
frequency = frequency,
channelCount = channels,
samples = Utils.Bytes.FloatsToBytes(samples)
};
OnFrameReady?.Invoke(frame);
}
public void Dispose() {
if(Device != null)
Device.OnFrameCollected -= OnFrameCollected;
Debug.unityLogger.Log(TAG, "Disposed");
}
}
}