Ok, jag gjorde ett ärligt försök att hitta ett nytt fritidsintresse igår… Det sket sig rätt bra… Så fort Love sov och jag pandorat iväg började jag fundera på sånadär “baby-watch” grejjer. Ni vet, man stuffar in dom i barnets säng och sedan går man på afterski med en walkie-talkie i fickan… Eller nåt… Jag har aldrig behövt någon, men det stör mig alltid att man skall köpa så mycket prylar när jag redan sitter på det coolase. En Vista Ultimate, den senaste smart-phonen och en såndär lam örongrejj som managementkonsulter drömmer våta drömmar om…

Jag tänkte, MacGyver… Jag tänkte… Jag kan göra en egen! Hur svårt kan det vara…

1. Lägg management-öron-grejjen bredvid Loves kudde.
2. Koppla upp den med blåtand till min laptop med Windows Vista Ultimate (älskar det namnet (och att den tillför värdet att man kan ha rörliga björnar som äter fisk på desktoppen!))
3. Skriva en app som känner av ljudnivån och larmar när Love skriker.
4. Attacha ett ljudklipp med skriket och skicka till min mail…
5. Mailet kommer att poppa upp i min smartphone via push-mail och jag kan kolla vem han ropar på… Och agera!

EarThing_thumb

Min första tanke var att skriva en klass som wrappade Mixer API:t och använda;

   1:          [DllImport("winmm.dll")]
   2:          private static extern Int32 mixerGetLineInfo(IntPtr hmxobj,
   3:                                                       ref MIXERLINE pmxl, UInt32 fdwInfo);

för att kunna komma åt en lina och sedan sampla ut var som rör sig där, ta något slags medelvärde och skruva ihop min egen recording volume kontroll. Mixer API:t är riktigt, riktigt hårigt. Jag gjorde en sak med det för ett tag sedan och har fortfarande mardrömmar. Jag tänkte.. Vista rockar! Det måste finnas något enklare sätt…

Vad sägs om Speech APIt?

   1:              recognizer = new SpeechRecognizer();
   2:              recognizer.AudioLevelUpdated += new EventHandler<AudioLevelUpdatedEventArgs>(recognizer_AudioLevelUpdated);

Allt som behövs för att dra igång en SpeechRecognizer och hooka en handler till när Love börjar skrika! Efter 30 minuter hade jag applikationen klar…
Rascal2

Hela klassen ser ut såhär:

   1:  using System;
   2:  using System.Speech.Recognition;
   3:   
   4:  namespace RascalMonitor {
   5:      public class SoundMonitor {
   6:          private SpeechRecognizer recognizer;
   7:          private int alarmLevel = 50;
   8:          public event EventHandler<RascalEventArgs> Alarm;
   9:          public event EventHandler<RascalEventArgs> AudioLevelChanged;
  10:   
  11:          public int AlarmLevel {
  12:              get { return alarmLevel; }
  13:              set { alarmLevel = value; }
  14:          }
  15:   
  16:          public SoundMonitor(int alarmLevel) {
  17:              recognizer = new SpeechRecognizer();
  18:              recognizer.AudioLevelUpdated += new EventHandler<AudioLevelUpdatedEventArgs>(recognizer_AudioLevelUpdated);
  19:          }
  20:   
  21:          public SoundMonitor() : this(50) {
  22:          }
  23:   
  24:          private void recognizer_AudioLevelUpdated(object sender, AudioLevelUpdatedEventArgs e) {
  25:              int soundLevel = recognizer.AudioLevel;
  26:   
  27:              if (AudioLevelChanged != null) {
  28:                  AudioLevelChanged(this, new RascalEventArgs(e.AudioLevel));
  29:              }
  30:   
  31:              if (soundLevel > alarmLevel) {
  32:                  if (Alarm != null) {
  33:                      Alarm(this, new RascalEventArgs(e.AudioLevel));
  34:                  }
  35:              }
  36:          }
  37:      }
  38:  }

Sen var det bara att kicka fram en konsoll klient och köra. Sa jag att det är en kakbit att via System.Speech Managed DirectSound, spela in en minut av skrik efter att ljudnivån passerat en acceptabel nivå, attacha det till mailet och skicka hela kakan? Så kallt!

Ni kan hitta källkod till projektet här… En annan cool sak är att det krävs två rader c# kod för att få Vista att börja tugga!!!

   1:              synth.SetOutputToDefaultAudioDevice();
   2:              synth.SpeakAsync(“I love this company!!!”);            

 Coolt! Jag behöver inget nytt fritidsintresse… ;-)

PS. Love utlöste larmet 3 gånger (på en alarmnivå på 40), sen stängde jag butiken, tog in honom till mig och somnade… En bra kväll!