add unit test

This commit is contained in:
Chikashi Miyama 2019-10-01 22:20:55 +02:00
parent 757df84bdb
commit 1267a9715a
16 changed files with 1018 additions and 589 deletions

View file

@ -15,7 +15,8 @@
<e p="RectangularSelection.cs" t="Include" /> <e p="RectangularSelection.cs" t="Include" />
<e p="SpectrumGenerator.cs" t="Include" /> <e p="SpectrumGenerator.cs" t="Include" />
<e p="UnitTest" t="Include"> <e p="UnitTest" t="Include">
<e p="UnitTest_ParameterResponder.cs" t="Include" /> <e p="UnitTest_ChangeObserver.cs" t="Include" />
<e p="UnitTest_SpectrumGenerator.cs" t="Include" />
</e> </e>
</e> </e>
<e p="Resources" t="Include"> <e p="Resources" t="Include">
@ -32,16 +33,17 @@
</e> </e>
</e> </e>
<e p="Scripts" t="Include"> <e p="Scripts" t="Include">
<e p="DataModel" t="Include">
<e p="Parameter.cs" t="Include" />
</e>
<e p="PdConnection" t="Include"> <e p="PdConnection" t="Include">
<e p="FFTArrayContainer.cs" t="Include" /> <e p="FFTArrayContainer.cs" t="Include" />
<e p="PdArray.cs" t="Include" /> <e p="PdArray.cs" t="Include" />
<e p="PdBackend.cs" t="Include" /> <e p="PdBackend.cs" t="Include" />
<e p="PdConstant.cs" t="Include" />
<e p="PdProcess.cs" t="Include" /> <e p="PdProcess.cs" t="Include" />
<e p="PdSocket.cs" t="Include" />
<e p="PdSpectrumBind.cs" t="Include" /> <e p="PdSpectrumBind.cs" t="Include" />
<e p="UdpSender.cs" t="Include" /> </e>
<e p="TemplateLibrary" t="Include">
<e p="ChangeObserver.cs" t="Include" />
</e> </e>
<e p="Versioning" t="Include"> <e p="Versioning" t="Include">
<e p="VersionToggleBehaviour.cs" t="Include" /> <e p="VersionToggleBehaviour.cs" t="Include" />

File diff suppressed because it is too large Load diff

View file

@ -64,6 +64,7 @@
<Compile Include="Assets\Editor\RectangularSelection.cs" /> <Compile Include="Assets\Editor\RectangularSelection.cs" />
<Compile Include="Assets\Editor\SpectrumGenerator.cs" /> <Compile Include="Assets\Editor\SpectrumGenerator.cs" />
<Compile Include="Assets\Editor\UnitTest\UnitTest_ChangeObserver.cs" /> <Compile Include="Assets\Editor\UnitTest\UnitTest_ChangeObserver.cs" />
<Compile Include="Assets\Editor\UnitTest\UnitTest_SpectrumGenerator.cs" />
<Compile Include="Assets\Scripts\VideoInput\Editor\UnitTest\ComponentFactoryTestCase.cs" /> <Compile Include="Assets\Scripts\VideoInput\Editor\UnitTest\ComponentFactoryTestCase.cs" />
<Compile Include="Assets\Scripts\VideoInput\Editor\UnitTest\KinectSensorTestCase.cs" /> <Compile Include="Assets\Scripts\VideoInput\Editor\UnitTest\KinectSensorTestCase.cs" />
<Compile Include="Assets\ThridParty\Editor\KinectCopyPluginDataHelper.cs" /> <Compile Include="Assets\ThridParty\Editor\KinectCopyPluginDataHelper.cs" />

View file

@ -44,8 +44,6 @@ namespace cylvester
pdBackend_.mainPatch = GUILayout.TextField(pdBackend_.mainPatch, 30); pdBackend_.mainPatch = GUILayout.TextField(pdBackend_.mainPatch, 30);
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
pdBackend_.inchannels = EditorGUILayout.Popup("Number of input channels", pdBackend_.inchannels, channels_);
if (Application.isPlaying) if (Application.isPlaying)
{ {
RenderSamplePlayback(); RenderSamplePlayback();

View file

@ -19,7 +19,6 @@ namespace cylvester
private SerializedProperty selectionProperty_; private SerializedProperty selectionProperty_;
private SerializedProperty pdBackendProperty_; private SerializedProperty pdBackendProperty_;
public void OnEnable() public void OnEnable()
{ {
spectrumGenerator_ = new SpectrumGenerator(TextureWidth, TextureHeight); spectrumGenerator_ = new SpectrumGenerator(TextureWidth, TextureHeight);
@ -27,7 +26,6 @@ namespace cylvester
pdBackendProperty_ = serializedObject.FindProperty("pdBackend"); pdBackendProperty_ = serializedObject.FindProperty("pdBackend");
selectionProperty_ = serializedObject.FindProperty("selection"); selectionProperty_ = serializedObject.FindProperty("selection");
} }
public override void OnInspectorGUI() public override void OnInspectorGUI()
@ -40,13 +38,11 @@ namespace cylvester
RenderSpectrumExtractor(behaviour); RenderSpectrumExtractor(behaviour);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
private void RenderSpectrumExtractor(IPdSpectrumBind behaviour) private void RenderSpectrumExtractor(IPdSpectrumBind behaviour)
{ {
UpdateSelection(behaviour); RenderSelection();
GUILayout.Space(5); GUILayout.Space(5);
GUILayout.Label("Spectrum Extractor", EditorStyles.boldLabel); GUILayout.Label("Spectrum Extractor", EditorStyles.boldLabel);
@ -63,18 +59,14 @@ namespace cylvester
GUI.DrawTexture(paintSpace_, spectrumGenerator_.Spectrum); GUI.DrawTexture(paintSpace_, spectrumGenerator_.Spectrum);
} }
GUILayout.BeginHorizontal();
GUILayout.Label("Extracted Energy", EditorStyles.boldLabel);
GUILayout.Label(behaviour.Energy.ToString());
GUILayout.EndHorizontal();
Repaint(); Repaint();
RenderExtractedEnergy(behaviour.Energy);
} }
private void UpdateSelection(IPdSpectrumBind behaviour) private void RenderSelection()
{
if (Event.current.isMouse && Event.current.button == 0)
{ {
if (!Event.current.isMouse || Event.current.button != 0) return;
switch (Event.current.type) switch (Event.current.type)
{ {
case EventType.MouseDown: case EventType.MouseDown:
@ -89,6 +81,14 @@ namespace cylvester
} }
} }
} }
}
private void RenderExtractedEnergy(int energy)
{
GUILayout.BeginHorizontal();
GUILayout.Label("Extracted Energy", EditorStyles.boldLabel);
GUILayout.Label(energy.ToString());
GUILayout.EndHorizontal();
}
} }
} }

View file

@ -10,20 +10,19 @@ namespace cylvester
public class SpectrumGenerator : ISpectrumGenerator public class SpectrumGenerator : ISpectrumGenerator
{ {
private Texture2D texture_; public Texture2D Spectrum { get; }
public Texture2D Spectrum => texture_;
public SpectrumGenerator(int width, int height) public SpectrumGenerator(int width, int height)
{ {
texture_ = new Texture2D(width, height); Spectrum = new Texture2D(width, height);
} }
public int Update(IPdArray pdArray, Rect selectionRect) public int Update(IPdArray pdArray, Rect selectionRect)
{ {
var numPixels = 0; var numPixels = 0;
for (var x = 0; x < texture_.width; x++) for (var x = 0; x < Spectrum.width; x++)
{ {
for (var y = 0; y < texture_.height; y++) for (var y = 0; y < Spectrum.height; y++)
{ {
var color = Color.black; var color = Color.black;
var validPixel = false; var validPixel = false;
@ -35,23 +34,28 @@ namespace cylvester
color = validPixel ? Color.green : Color.black; color = validPixel ? Color.green : Color.black;
} }
var mY = texture_.height - selectionRect.y; if (IsInSelection(x, y, ref selectionRect))
if ((selectionRect.x < x && x < (selectionRect.x + selectionRect.width)) &&
(mY - selectionRect.height < y && y < mY))
{ {
color.a = 1f; color.a = 1f;
if (validPixel) if (validPixel)
numPixels++; numPixels++;
} }
else else
{
color.a = 0.2f; color.a = 0.2f;
}
texture_.SetPixel(x, y, color); Spectrum.SetPixel(x, y, color);
} }
} }
texture_.Apply(); Spectrum.Apply();
return numPixels; return numPixels;
} }
private bool IsInSelection(int x, int y, ref Rect selectionRect)
{
var inRectHorizontally = selectionRect.x < x && x < selectionRect.x + (selectionRect.width-1);
var mY = Spectrum.height - selectionRect.y;
var inRectVertically = mY - (selectionRect.height-1) < y && y < mY;
return inRectHorizontally && inRectVertically;
}
} }
} }

View file

@ -0,0 +1,87 @@
using NUnit.Framework;
using NSubstitute;
using UnityEngine;
namespace cylvester
{
[TestFixture]
public class UnitTest_SpectrumGenerator
{
private IPdArray pdArray_;
private Rect selectionRect_;
private float[] dummyData_;
private Color standardColor_;
private Color selectedColor_;
[SetUp]
public void SetUp()
{
pdArray_ = Substitute.For<IPdArray>();
selectionRect_ = new Rect {x = 9, y = 9, width = 3, height = 3};
dummyData_ = new float[100];
for (var i = 0; i < dummyData_.Length; ++i)
{
dummyData_[i] = i / (float)dummyData_.Length;
}
standardColor_ = new Color(0f, 0f, 0f, 0.2f);
selectedColor_ = new Color(0f, 0f, 0f, 1f);
}
[Test]
public void Construction()
{
var spectrumGenerator = new SpectrumGenerator(100, 101);
Assert.AreEqual(100, spectrumGenerator.Spectrum.width);
Assert.AreEqual(101, spectrumGenerator.Spectrum.height);
}
[Test]
public void Update_array_available()
{
var spectrumGenerator = new SpectrumGenerator(100, 100);
spectrumGenerator.Update(pdArray_, selectionRect_);
}
[Test]
public void Update_array_unavailable()
{
var noSelection = new Rect {width = 0, height = 0};
var spectrumGenerator = new SpectrumGenerator(100, 100);
var validPixels = spectrumGenerator.Update(null, noSelection);
Assert.AreEqual(0, validPixels);
var texture = spectrumGenerator.Spectrum;
var pixels = texture.GetPixels();
foreach (var pixel in pixels)
Assert.AreEqual(standardColor_, pixel);
}
[Test]
public void Update_array_unavailable_with_selection()
{
var spectrumGenerator = new SpectrumGenerator(100, 100);
var validPixels = spectrumGenerator.Update(null, selectionRect_);
Assert.AreEqual(0, validPixels);
var texture = spectrumGenerator.Spectrum;
for (var x = 0; x < 100; x++)
{
for (var y = 0; y < 100; y++)
{
if(x == 10 && y == 90) // because vertically inverted
Assert.AreEqual(selectedColor_, texture.GetPixel(x, y));
else
Assert.AreEqual(standardColor_, texture.GetPixel(x, y));
}
}
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 569cb1b5c266408cb26f97a8e7510191
timeCreated: 1569957130

View file

@ -0,0 +1,259 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>NSubstitute</name>
</assembly>
<members>
<member name="T:NSubstitute.Arg">
<summary>
Argument matchers used for specifying calls to substitutes.
</summary>
</member>
<member name="M:NSubstitute.Arg.Any``1">
<summary>
Match any argument value compatible with type <typeparamref name="T"/>.
</summary>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Is``1(``0)">
<summary>
Match argument that is equal to <paramref name="value"/>.
</summary>
<typeparam name="T"></typeparam>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Is``1(System.Linq.Expressions.Expression{System.Predicate{``0}})">
<summary>
Match argument that satisfies <paramref name="predicate"/>.
If the <paramref name="predicate"/> throws an exception for an argument it will be treated as non-matching.
</summary>
<typeparam name="T"></typeparam>
<param name="predicate"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Invoke">
<summary>
Invoke any <see cref="T:System.Action"/> argument as soon as a matching call is made to the substitute.
</summary>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Invoke``1(``0)">
<summary>
Invoke any <see cref="T:System.Action`1"/> argument with specified argument as soon as a matching call is made to the substitute.
</summary>
<typeparam name="T"></typeparam>
<param name="arg"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Invoke``2(``0,``1)">
<summary>
Invoke any <see cref="T:System.Action`2"/> argument with specified arguments as soon as a matching call is made to the substitute.
</summary>
<typeparam name="T1"></typeparam>
<typeparam name="T2"></typeparam>
<param name="arg1"></param>
<param name="arg2"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Invoke``3(``0,``1,``2)">
<summary>
Invoke any <see cref="T:System.Action`3"/> argument with specified arguments as soon as a matching call is made to the substitute.
</summary>
<typeparam name="T1"></typeparam>
<typeparam name="T2"></typeparam>
<typeparam name="T3"></typeparam>
<param name="arg1"></param>
<param name="arg2"></param>
<param name="arg3"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Invoke``4(``0,``1,``2,``3)">
<summary>
Invoke any <see cref="T:System.Action`4"/> argument with specified arguments as soon as a matching call is made to the substitute.
</summary>
<typeparam name="T1"></typeparam>
<typeparam name="T2"></typeparam>
<typeparam name="T3"></typeparam>
<typeparam name="T4"></typeparam>
<param name="arg1"></param>
<param name="arg2"></param>
<param name="arg3"></param>
<param name="arg4"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.InvokeDelegate``1(System.Object[])">
<summary>
Invoke any <typeparamref name="TDelegate"/> argument with specified arguments as soon as a matching call is made to the substitute.
</summary>
<typeparam name="TDelegate"></typeparam>
<param name="arguments">Arguments to pass to delegate.</param>
<returns></returns>
</member>
<member name="M:NSubstitute.Arg.Do``1(System.Action{``0})">
<summary>
Capture any argument compatible with type <typeparamref name="T"/> and use it to call the <paramref name="useArgument"/> function
as soon as a matching call is made to the substitute.
</summary>
<typeparam name="T"></typeparam>
<param name="useArgument"></param>
<returns></returns>
</member>
<member name="T:NSubstitute.IArgumentMatcher">
<summary>
Provides a specification for arguments for use with <see ctype="Arg.Matches (IArgumentMatcher)" />.
Can additionally implement <see ctype="IDescribeNonMatches" /> to give descriptions when arguments do not match.
</summary>
</member>
<member name="M:NSubstitute.IArgumentMatcher.IsSatisfiedBy(System.Object)">
<summary>
Checks whether the <paramref name="argument"/> satisfies the condition of the matcher.
If this throws an exception the argument will be treated as non-matching.
</summary>
<param name="argument"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.IDescribeNonMatches.DescribeFor(System.Object)">
<summary>
Describes how the <paramref name="argument"/> does not match the condition specified by this class, or <see cref="F:System.String.Empty"/>
if a detailed description can not be provided for the argument.
</summary>
<param name="argument"></param>
<returns>Description of the non-match, or <see cref="F:System.String.Empty"/> if no description can be provided.</returns>
</member>
<member name="M:NSubstitute.Core.Extensions.Zip``3(System.Collections.Generic.IEnumerable{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``1,``2})">
<summary>
Combines two enumerables into a new enumerable using the given selector.
</summary>
<typeparam name="TFirst"></typeparam>
<typeparam name="TSecond"></typeparam>
<typeparam name="TResult"></typeparam>
<param name="first"></param>
<param name="second"></param>
<param name="selector"></param>
<returns></returns>
<remarks>
This implementation was sanity-checked against the
<a href="http://msmvps.com/blogs/jon_skeet/archive/2011/01/14/reimplementing-linq-to-objects-part-35-zip.aspx">Edulinq implementation</a> and
<a href="http://blogs.msdn.com/b/ericlippert/archive/2009/05/07/zip-me-up.aspx">Eric Lippert's implementation</a>.
</remarks>
</member>
<member name="M:NSubstitute.Core.Extensions.IsCompatibleWith(System.Object,System.Type)">
<summary>
Checks if the instance can be used when a <paramref name="type"/> is expected.
</summary>
<param name="instance"></param>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Core.Extensions.Join(System.Collections.Generic.IEnumerable{System.String},System.String)">
<summary>
Join the <paramref name="strings"/> using <paramref name="seperator"/>.
</summary>
<param name="strings"></param>
<param name="seperator"></param>
<returns></returns>
</member>
<member name="T:NSubstitute.Core.RobustThreadLocal`1">
<summary>
Delegates to ThreadLocal&lt;T&gt;, but wraps Value property access in try/catch to swallow ObjectDisposedExceptions.
These can occur if the Value property is accessed from the finalizer thread. Because we can't detect this, we'll
just swallow the exception (the finalizer thread won't be using any of the values from thread local storage anyway).
</summary>
<typeparam name="T"></typeparam>
</member>
<member name="T:NSubstitute.IArgumentMatcher`1">
<summary>
Provides a specification for arguments for use with <see ctype="Arg.Matches &lt; T &gt;(IArgumentMatcher)" />.
Can additionally implement <see ctype="IDescribeNonMatches" /> to give descriptions when arguments do not match.
</summary>
<typeparam name="T">Matches arguments of type <typeparamref name="T"/> or compatible type.</typeparam>
</member>
<member name="M:NSubstitute.IArgumentMatcher`1.IsSatisfiedBy(`0)">
<summary>
Checks whether the <paramref name="argument"/> satisfies the condition of the matcher.
If this throws an exception the argument will be treated as non-matching.
</summary>
<param name="argument"></param>
<returns></returns>
</member>
<member name="M:NSubstitute.Raise.EventWith``1(System.Object,``0)">
<summary>
Raise an event for an <c>EventHandler&lt;TEventArgs&gt;</c> event with the provided <paramref name="sender"/> and <paramref name="eventArgs"/>.
</summary>
</member>
<member name="M:NSubstitute.Raise.EventWith``1(``0)">
<summary>
Raise an event for an <c>EventHandler&lt;TEventArgs&gt;</c> event with the substitute as the sender and the provided <paramref name="eventArgs" />.
</summary>
</member>
<member name="M:NSubstitute.Raise.EventWith``1">
<summary>
Raise an event for an <c>EventHandler&lt;EventArgsT&gt;</c> event with the substitute as the sender
and with a default instance of <typeparamref name="TEventArgs" />.
</summary>
</member>
<member name="M:NSubstitute.Raise.Event">
<summary>
Raise an event for an <c>EventHandler</c> or <c>EventHandler&lt;EventArgs&gt;</c> event with the substitute
as the sender and with empty <c>EventArgs</c>.
</summary>
</member>
<member name="M:NSubstitute.Raise.Event``1(System.Object[])">
<summary>
Raise an event of type <typeparamref name="THandler" /> with the provided arguments. If no arguments are provided
NSubstitute will try and provide reasonble defaults.
</summary>
</member>
<member name="T:NSubstitute.Substitute">
<summary>
Create a substitute for one or more types. For example: <c>Substitute.For&lt;ISomeType&gt;()</c>
</summary>
</member>
<member name="M:NSubstitute.Substitute.For``1(System.Object[])">
<summary>
Substitute for an interface or class.
<para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members
can be recorded or have return values specified.</para>
</summary>
<typeparam name="T">The type of interface or class to substitute.</typeparam>
<param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
<returns>A substitute for the interface or class.</returns>
</member>
<member name="M:NSubstitute.Substitute.For``2(System.Object[])">
<summary>
<para>Substitute for multiple interfaces or a class that implements an interface. At most one class can be specified.</para>
<para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members
can be recorded or have return values specified.</para>
</summary>
<typeparam name="T1">The type of interface or class to substitute.</typeparam>
<typeparam name="T2">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
<param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
<returns>A substitute of type T1, that also implements T2.</returns>
</member>
<member name="M:NSubstitute.Substitute.For``3(System.Object[])">
<summary>
<para>Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified.</para>
If additional interfaces are required use the <see cref="M:For(System.Type[], System.Object[])" /> overload.
<para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members
can be recorded or have return values specified.</para>
</summary>
<typeparam name="T1">The type of interface or class to substitute.</typeparam>
<typeparam name="T2">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
<typeparam name="T3">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
<param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
<returns>A substitute of type T1, that also implements T2 and T3.</returns>
</member>
<member name="M:NSubstitute.Substitute.For(System.Type[],System.Object[])">
<summary>
<para>Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified.</para>
<para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members
can be recorded or have return values specified.</para>
</summary>
<param name="typesToProxy">The types of interfaces or a type of class and multiple interfaces the substitute should implement.</param>
<param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
<returns>A substitute implementing the specified types.</returns>
</member>
</members>
</doc>

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bdc35bfcd6b707f4fb1a603ebd847600
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -202,7 +202,13 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 54ab37d032df403e881d6a7a78141815, type: 3} m_Script: {fileID: 11500000, guid: 54ab37d032df403e881d6a7a78141815, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
pdBackend: {fileID: 987772533} pdBackend: {fileID: 0}
selection:
serializedVersion: 2
x: 297.75885
y: 55
width: 101.67376
height: 102
--- !u!1 &267275365 --- !u!1 &267275365
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -315,7 +321,7 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
mainPatch: analyzer.pd mainPatch: analyzer.pd
inchannels: 2 samplePlayback: 0
--- !u!4 &987772534 --- !u!4 &987772534
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View file

@ -6,10 +6,9 @@ namespace cylvester
public class PdBackend : MonoBehaviour public class PdBackend : MonoBehaviour
{ {
public string mainPatch = "analyzer.pd"; public string mainPatch = "analyzer.pd";
public int inchannels = 2;
public int samplePlayback = 0; public int samplePlayback = 0;
public PdArray levelMeterArray; public PdArray levelMeterArray;
public FftArrayContainer fftArrayContainer; public IFftArrayContainer fftArrayContainer;
private IChangeObserver<int> samplePlaybackObserver_; private IChangeObserver<int> samplePlaybackObserver_;
private Action onSamplePlaybackChanged_; private Action onSamplePlaybackChanged_;
@ -18,7 +17,7 @@ namespace cylvester
private void Start() private void Start()
{ {
PdProcess.Instance.Start(mainPatch, inchannels); PdProcess.Instance.Start(mainPatch);
levelMeterArray = new PdArray("levelmeters", PdConstant.NumMaxInputChannels); levelMeterArray = new PdArray("levelmeters", PdConstant.NumMaxInputChannels);
fftArrayContainer = new FftArrayContainer(); fftArrayContainer = new FftArrayContainer();
pdSocket_ = new PdSocket(PdConstant.ip, PdConstant.port); pdSocket_ = new PdSocket(PdConstant.ip, PdConstant.port);
@ -27,7 +26,7 @@ namespace cylvester
onSamplePlaybackChanged_ = () => onSamplePlaybackChanged_ = () =>
{ {
var bytes = new byte[]{(byte)PdMessage.SampleSound, (byte)samplePlayback}; var bytes = new[]{(byte)PdMessage.SampleSound, (byte)samplePlayback};
pdSocket_.Send(bytes); pdSocket_.Send(bytes);
}; };
@ -48,7 +47,6 @@ namespace cylvester
levelMeterArray.Update(); levelMeterArray.Update();
fftArrayContainer.Update(); fftArrayContainer.Update();
samplePlaybackObserver_.Value = samplePlayback; samplePlaybackObserver_.Value = samplePlayback;
} }
} }

View file

@ -10,8 +10,5 @@ namespace cylvester
public static readonly int NumMaxInputChannels = 16; public static readonly int NumMaxInputChannels = 16;
public static readonly string ip = "127.0.0.1"; public static readonly string ip = "127.0.0.1";
public static readonly int port = 54345; public static readonly int port = 54345;
} }
} }

View file

@ -6,14 +6,7 @@ using Debug = UnityEngine.Debug;
namespace cylvester namespace cylvester
{ {
interface IPdProcess public class PdProcess
{
void Start(string mainPatch, int numInputChannels);
void Stop();
bool Running { get; }
}
public class PdProcess : IPdProcess
{ {
private static PdProcess instance_ = null; private static PdProcess instance_ = null;
private Process pdProcess_; private Process pdProcess_;
@ -22,10 +15,9 @@ namespace cylvester
{ {
} // cannot be instantiate normally } // cannot be instantiate normally
public static PdProcess Instance => instance_ ?? (instance_ = new PdProcess()); public static PdProcess Instance => instance_ ?? (instance_ = new PdProcess());
public void Start(string mainPatch, int numInputChannels) public void Start(string mainPatch)
{ {
if (pdProcess_ != null) if (pdProcess_ != null)
@ -41,7 +33,7 @@ namespace cylvester
pdProcess_.StartInfo.FileName = Application.streamingAssetsPath + "/pd/win/pd.com"; pdProcess_.StartInfo.FileName = Application.streamingAssetsPath + "/pd/win/pd.com";
var path = Application.streamingAssetsPath + "/pd/patch/" + mainPatch; var path = Application.streamingAssetsPath + "/pd/patch/" + mainPatch;
pdProcess_.StartInfo.Arguments = "-nogui -rt -inchannels " + numInputChannels + " " + path; pdProcess_.StartInfo.Arguments = "-nogui -rt " + path;
if (!pdProcess_.Start()) if (!pdProcess_.Start())
{ {
@ -59,7 +51,6 @@ namespace cylvester
pdProcess_.Kill(); pdProcess_.Kill();
pdProcess_ = null; pdProcess_ = null;
Debug.Log("Pd Process stopped"); Debug.Log("Pd Process stopped");
} }
public bool Running public bool Running

View file

@ -1,3 +1,6 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer&gt;&#xD;
&lt;Assembly Path="C:\Users\chikashi\Development\Soundvision\UnityProject\Assets\Plugins\NSubstitute.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kinect/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Kinect/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Shmem/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> <s:Boolean x:Key="/Default/UserDictionary/Words/=Shmem/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>