public Clapper() { // for pumping XNA framework events t = new Timer() { Interval = 50, }; t.Tick += new EventHandler(t_Tick); UpperThreshold = 3000; LowerThreshold = 800; state = ClapperState.WaitLow; eventWatch = new Stopwatch(); window = new Queue<short>(); m = Microphone.Default; buffer = new byte[m.GetSampleSizeInBytes(TimeSpan.FromMilliseconds(100))]; m.BufferReady += new EventHandler<EventArgs>(m_BufferReady); }
// This isn't great but the idea is that // there must be two peaks separated by more than 100ms // and those peaks must be within 1 second void StateCheck(short v) { if (eventWatch.ElapsedMilliseconds > 1000) { Debug.WriteLine("Timeout: Reset State"); state = ClapperState.WaitLow; eventWatch.Reset(); } switch (state) { case ClapperState.WaitLow: if (v > UpperThreshold) { Debug.WriteLine("WL1 {0}", v); state = ClapperState.WaitHigh; eventWatch.Start(); } break; case ClapperState.WaitHigh: if (v < LowerThreshold && eventWatch.ElapsedMilliseconds > 50) { Debug.WriteLine("WH1 {0}", v); state = ClapperState.WaitLow2; eventWatch.Restart(); } break; case ClapperState.WaitLow2: if (v > UpperThreshold && eventWatch.ElapsedMilliseconds > 100) { Debug.WriteLine("WL2 {0}", v); state = ClapperState.WaitHigh2; eventWatch.Restart(); } break; case ClapperState.WaitHigh2: if (v < LowerThreshold && eventWatch.ElapsedMilliseconds > 50) { Debug.WriteLine("WH2 {0}", v); state = ClapperState.WaitLow; eventWatch.Reset(); if (OnClap != null) { OnClap(this, new ClapperEventArgs()); } } break; } }