×
Namespaces

Variants
Actions
(Difference between revisions)

How to access and manage the Microphone raw data in WP

From Nokia Developer Wiki
Jump to: navigation, search
galazzo (Talk | contribs)
(Galazzo -)
galazzo (Talk | contribs)
m (Galazzo -)
Line 178: Line 178:
 
File:ShooterAssistantLaunchSchemes.png|Launch Schemes Screen
 
File:ShooterAssistantLaunchSchemes.png|Launch Schemes Screen
 
</gallery>
 
</gallery>
 +
 +
== Related Links ==
 +
* [http://www.developer.nokia.com/Community/Wiki/Using_QMicrophone Using QMicrophone] - Symbian platform

Revision as of 14:54, 6 April 2012

WP Metro Icon Multimedia.png
WP Metro Icon WP8.png
SignpostIcon WP7 70px.png
Article Metadata
Code ExampleTested with
SDK: built and tested against Windows Phone SDK 7.1
Devices(s): Nokia Lumia 800
Compatibility
Platform(s): Windows Phone
Windows Phone 8
Windows Phone 7.5
Article
Keywords: Xna,Microphone, Volume, Raw, Audio
Created: galazzo (06 Apr 2012)
Last edited: galazzo (06 Apr 2012)

Contents

Introduction

This article will explain how to manage microphone raw data in Windows Phone, focusing on Volume management. Will be shown a real application Shooter Assistant, a work in progress project to assist the shooter during training for Olympic Trap speciality, also applicable for Skeet and Double Trap speciality.

Creating the project

  • Install Windows Phone SDK
  • Create a new project by selecting the File | New Project menu command.
  • The New Project window will be displayed. Expand the Visual C# templates, and then select the Silverlight for Windows Phone templates.
  • Select the Windows Phone Application template. Fill in the project name as desired. {Note|Don't call it simply "Microphone"}
  • In the Solution Explorer, right-click References and choose Add Reference.
  • Choose Microsoft.Xna.Framework from the list of .NET components and click the OK button.
  • If you see a dialog that warns about adding a reference to a Silverlight assembly, click the Yes button.

Add the following using statements to the top of your MainPage.xaml.cs file:

using System.IO;
using System.Windows.Threading;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;

In MainPage.xaml.cs, declare variables as global members of your MainPage class:

public partial class MainPage : PhoneApplicationPage
{
 
Microphone microphone = Microphone.Default;
byte[] buffer;
MemoryStream stream = new MemoryStream();
SoundEffect sound;
 
// Constructor
public MainPage()
{

Add the following code to the constructor of your MainPage class after the call to InitializeComponent

// Contructor
public MainPage()
{
InitializeComponent();
 
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(50);
dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
dt.Start();
 
microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
}

Now add the following method to manage Microphone raw data

void microphone_BufferReady(object sender, EventArgs e)
{
microphone.GetData(buffer);
// If you want to store the audio data in a stream
stream.Write(buffer, 0, buffer.Length);
}

Detecting Volume changes. The RMS Method.

Declare a global variable in your MainPage class to set threshold:

public partial class MainPage : PhoneApplicationPage
{
Microphone microphone = Microphone.Default;
byte[] buffer;
MemoryStream stream = new MemoryStream();
SoundEffect sound;
....
private int minimumThreshold = 500;
....
void microphone_BufferReady(object sender, EventArgs e)
{
// Retrieve audio data
microphone.GetData(buffer);
 
// RMS Method
double rms = 0;
ushort byte1 = 0;
ushort byte2 = 0;
short value = 0;
int volume = 0;
rms = (short)(byte1 | (byte2 << 8));
 
for (int i = 0; i < buffer.Length - 1; i += 2)
{
byte1 = buffer[i];
byte2 = buffer[i + 1];
 
value = (short)(byte1 | (byte2 << 8));
rms += Math.Pow(value, 2);
}
rms /= (double)(buffer.Length / 2);
volume = (int)Math.Floor(Math.Sqrt(rms));
 
if ((volume > minimumThreshold))
{
System.Diagnostics.Debug.WriteLine("Threshold exceeded");
System.Diagnostics.Debug.WriteLine("buffer.Length" + buffer.Length + " Volume:" + volume);
}
}

Start Recording

private void recordButton_Click(object sender, RoutedEventArgs e)
{
if (microphone.State == MicrophoneState.Stopped)
{
microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
microphone.Start();
System.Diagnostics.Debug.WriteLine("Threshold setted to:" + minimumThreshold);
}
}

Stop Recording

private void stopButton_Click(object sender, RoutedEventArgs e)
{
if (microphone.State == MicrophoneState.Started)
{
microphone.Stop();
}
}

Shooter Assistant

Olympic Trap shooting is one of the three major forms of competitive clay shooting, generally shot with a 12 gauge with a double barreled shotgun. The clay target is launched automatically and instantly when the shooter's order starts, while he's waiting with the gun to his shoulder and charged with two shots. Each series consists of twenty-five plates. For each footboard are arranged three trap machines for a total, therefore, of 15 trap machines. The direction of the clay targets varies from 0 to 45 ° to the right or left. Its height, ten feet from the pit must be between 1.50 metres. 3, 50 metres. The clay target will touch the ground, after a parabolic curve, between 75 and 80 meters. The output speed of the pit usually fluctuates between 100 km/h and 120 km/h. The target is centered, usually, within a radius of 35 meters, then the reaction time of the shooter road from 5 to 6 tenths of a second.

Reaction time is the key of success. Results can heavily influenced being 1 tenths faster or slower.

Shooter Assistant helps the shooter training in that way:

Wearing earphones, given the start command, a beep will be played after 5 tenths seconds that means you have to press trigger. Of course reaction time changes based on target direction.
Collected results ( good and bad ), using genetic algorithms, the software fit itself your reaction time.

Related Links

403 page views in the last 30 days.