Traitement audio «à la volée» (C #, WP7)

Existe-t-il un moyen, en C #, sur un .NET, de traiter l’audio “à la volée”? Par exemple, si je veux évaluer l’intensité moyenne de l’audio au moment de l’enregistrement (pour cela, il me faudra au moins deux millisecondes).

Initialisation d’un microphone et traitement des sons enregistrés:

private void Initialize() { Microphone microphone = Microphone.Default; // 100 ms is a minimum buffer duration microphone.BufferDuration = TimeSpan.FromMilliseconds(100); DispatcherTimer updateTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(0.1) }; updateTimer.Tick += (s, e) => { FrameworkDispatcher.Update(); }; updateTimer.Start(); byte[] microphoneSignal = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; microphone.BufferReady += (s, e) => { int microphoneDataSize = microphone.GetData(microphoneSignal); double amplitude = GetSignalAmplitude(microphoneSignal); // do your stuff with amplitude here }; microphone.Start(); } 

Amplitude du signal global. Vous pouvez trouver des moyennes non pas dans tous les tableaux d’octets, mais dans des fenêtres plus petites pour obtenir une courbe d’amplitude:

 private double GetSignalAmplitude(byte[] signal) { int BytesInSample = 2; int signalSize = signal.Length / BytesInSample; double Sum = 0.0; for (int i = 0; i < signalSize; i++) { int sample = Math.Abs(BitConverter.ToInt16(signal, i * BytesInSample)); Sum += sample; } double amplitude = Sum / signalSize; return amplitude; } 

D'autres éléments pour générer des sons à la volée qui pourraient vous aider à l'avenir:

 DynamicSoundEffectInstance generatedSound = new DynamicSoundEffectInstance(SampleRate, AudioChannels.Mono); generatedSound.SubmitBuffer(buffer); private void Int16ToTwoBytes(byte[] output, Int16 value, int offset) { output[offset + 1] = (byte)(value >> 8); output[offset] = (byte)(value & 0x00FF); }