108 lines
2.1 KiB
C#
108 lines
2.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class CheckVolumeChanges : MonoBehaviour
|
|
{
|
|
public float testSound;
|
|
public static float MicLoudness;
|
|
private string _device;
|
|
private AudioClip _clipRecord;
|
|
private int _sampleWindow = 128;
|
|
private bool _isInitialized;
|
|
|
|
private float levelmic;
|
|
|
|
private void Awake()
|
|
{
|
|
StartCoroutine(checklevel());
|
|
}
|
|
|
|
void InitMic()
|
|
{
|
|
if (_device == null)
|
|
{
|
|
_device = Microphone.devices[0];
|
|
_clipRecord = Microphone.Start(_device, true, 999, 44100);
|
|
Debug.Log(_clipRecord);
|
|
}
|
|
}
|
|
|
|
void StopMicrophone()
|
|
{
|
|
Microphone.End(_device);
|
|
}
|
|
|
|
float LevelMax()
|
|
{
|
|
float levelMax = 0;
|
|
float[] waveData = new float[_sampleWindow];
|
|
int micPosition = Microphone.GetPosition(null) - (_sampleWindow + 1);
|
|
if (micPosition < 0)
|
|
{
|
|
return 0;
|
|
}
|
|
_clipRecord.GetData(waveData, micPosition);
|
|
for (int i = 0; i < _sampleWindow; ++i)
|
|
{
|
|
float wavePeak = waveData[i] * waveData[i];
|
|
if (levelMax < wavePeak)
|
|
{
|
|
levelMax = wavePeak;
|
|
}
|
|
}
|
|
return levelMax;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
MicLoudness = LevelMax();
|
|
testSound = MicLoudness;
|
|
|
|
levelmic += testSound;
|
|
}
|
|
|
|
IEnumerator checklevel() {
|
|
while (true)
|
|
{
|
|
yield return new WaitForSecondsRealtime(0.5f);
|
|
levelmic = 0;
|
|
}
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
InitMic();
|
|
_isInitialized = true;
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
StopMicrophone();
|
|
}
|
|
|
|
void OnDestory()
|
|
{
|
|
StopMicrophone();
|
|
}
|
|
|
|
void OnApplicationFocus(bool focus)
|
|
{
|
|
if (focus)
|
|
{
|
|
if (!_isInitialized)
|
|
{
|
|
InitMic();
|
|
_isInitialized = true;
|
|
}
|
|
}
|
|
|
|
if (!focus)
|
|
{
|
|
StopMicrophone();
|
|
_isInitialized = false;
|
|
}
|
|
}
|
|
}
|