-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKinectBackgroundController.cs
123 lines (115 loc) · 4.1 KB
/
KinectBackgroundController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Microsoft.Research.Kinect.Audio;
using System.ComponentModel;
using System.Windows.Media.Imaging;
using System.Windows.Media;
namespace KinectDAQ
{
class KinectBackgroundController : INotifyPropertyChanged
{
// KinectMicArray class courtesy of Microsoft
// http://kinectaudioposition.codeplex.com/
#region Properties
/// <summary>
/// PropertyChanged Event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
// Audio Source Angle and Current Beam Angle
public double SourceAngleProperty { get { return _sourceAngle; } }
public double BeamAngleProperty { get { return _beamAngle; } }
#endregion Properties
#region Constructors
// Constructor
public KinectBackgroundController()
{
_sourceAngle = 0.0;
_beamAngle = 0.0;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.WorkerSupportsCancellation = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.WorkerReportsProgress = true;
worker.RunWorkerAsync();
}
// Deconstructor
~KinectBackgroundController()
{
if (worker != null) this.Dispose();
}
// Dispose method
public void Dispose()
{
worker.CancelAsync();
worker.Dispose();
worker = null;
}
#endregion Constructors
private BackgroundWorker worker = new BackgroundWorker();
private double _sourceAngle;
private double _beamAngle;
private readonly int sleep = 100;
// Convert radian (Kinect) to degree (WPF)
private double RadToDeg(double rad)
{
return 180.0 * rad / Math.PI;
}
// Event handler from Background worker's Progress changed Event
// NotifyPropertyChnaged cannot be called from BackgrounWorker Thread
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string s = e.UserState as string;
if (s == "Beam")
{
NotifyPropertyChanged("BeamAngleProperty");
}
else
{
NotifyPropertyChanged("SourceAngleProperty");
}
}
#region BackgroundWorker
/// <summary>
/// Get audio source position angle from Kinect Microphone Array
/// </summary>
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
using (var source = new KinectAudioSource())
{
source.SystemMode = SystemMode.OptibeamArrayOnly;
source.BeamChanged += audio_BeamChanged;
//Start capturing audio
using (var audioStream = source.Start())
{
while (worker != null)
{
if (source.SoundSourcePositionConfidence > 0.75)
{
_sourceAngle = RadToDeg(source.SoundSourcePosition); // Why does the original source flip this angle?
worker.ReportProgress(0, "Source");
}
Thread.Sleep(sleep);
}
}
}
}
/// <summary>
/// Get Current Beam Angle
/// </summary>
private void audio_BeamChanged(object sender, BeamChangedEventArgs e)
{
_beamAngle = RadToDeg(e.Angle); // We're not using the beam angle information, but this shouldn't be negated
worker.ReportProgress(0, "Beam");
}
#endregion BackgroundWorker
}
}