|
|
#region License
|
|
|
/* FNA - XNA4 Reimplementation for Desktop Platforms
|
|
|
* Copyright 2009-2020 Ethan Lee and the MonoGame Team
|
|
|
*
|
|
|
* Released under the Microsoft Public License.
|
|
|
* See LICENSE for details.
|
|
|
*/
|
|
|
#endregion
|
|
|
|
|
|
#region Using Statements
|
|
|
using System;
|
|
|
using System.Runtime.InteropServices;
|
|
|
#endregion
|
|
|
|
|
|
namespace Microsoft.Xna.Framework.Audio
|
|
|
{
|
|
|
// http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.audioemitter.aspx
|
|
|
public class AudioEmitter
|
|
|
{
|
|
|
#region Public Properties
|
|
|
|
|
|
public float DopplerScale
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return emitterData.DopplerScaler;
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
if (value < 0.0f)
|
|
|
{
|
|
|
throw new ArgumentOutOfRangeException("AudioEmitter.DopplerScale must be greater than or equal to 0.0f");
|
|
|
}
|
|
|
emitterData.DopplerScaler = value;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public Vector3 Forward
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return new Vector3(
|
|
|
emitterData.OrientFront.x,
|
|
|
emitterData.OrientFront.y,
|
|
|
-emitterData.OrientFront.z
|
|
|
);
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
emitterData.OrientFront.x = value.X;
|
|
|
emitterData.OrientFront.y = value.Y;
|
|
|
emitterData.OrientFront.z = -value.Z;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public Vector3 Position
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return new Vector3(
|
|
|
emitterData.Position.x,
|
|
|
emitterData.Position.y,
|
|
|
-emitterData.Position.z
|
|
|
);
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
emitterData.Position.x = value.X;
|
|
|
emitterData.Position.y = value.Y;
|
|
|
emitterData.Position.z = -value.Z;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
public Vector3 Up
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return new Vector3(
|
|
|
emitterData.OrientTop.x,
|
|
|
emitterData.OrientTop.y,
|
|
|
-emitterData.OrientTop.z
|
|
|
);
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
emitterData.OrientTop.x = value.X;
|
|
|
emitterData.OrientTop.y = value.Y;
|
|
|
emitterData.OrientTop.z = -value.Z;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public Vector3 Velocity
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return new Vector3(
|
|
|
emitterData.Velocity.x,
|
|
|
emitterData.Velocity.y,
|
|
|
-emitterData.Velocity.z
|
|
|
);
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
emitterData.Velocity.x = value.X;
|
|
|
emitterData.Velocity.y = value.Y;
|
|
|
emitterData.Velocity.z = -value.Z;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Internal Variables
|
|
|
|
|
|
internal FAudio.F3DAUDIO_EMITTER emitterData;
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Private Static Variables
|
|
|
|
|
|
private static readonly float[] stereoAzimuth = new float[]
|
|
|
{
|
|
|
0.0f, 0.0f
|
|
|
};
|
|
|
private static readonly GCHandle stereoAzimuthHandle = GCHandle.Alloc(
|
|
|
stereoAzimuth,
|
|
|
GCHandleType.Pinned
|
|
|
);
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Public Constructor
|
|
|
|
|
|
public AudioEmitter()
|
|
|
{
|
|
|
emitterData = new FAudio.F3DAUDIO_EMITTER();
|
|
|
DopplerScale = 1.0f;
|
|
|
Forward = Vector3.Forward;
|
|
|
Position = Vector3.Zero;
|
|
|
Up = Vector3.Up;
|
|
|
Velocity = Vector3.Zero;
|
|
|
|
|
|
/* Unused variables, defaults based on XNA behavior */
|
|
|
emitterData.pCone = IntPtr.Zero;
|
|
|
emitterData.ChannelCount = 1;
|
|
|
emitterData.ChannelRadius = 1.0f;
|
|
|
emitterData.pChannelAzimuths = stereoAzimuthHandle.AddrOfPinnedObject();
|
|
|
emitterData.pVolumeCurve = IntPtr.Zero;
|
|
|
emitterData.pLFECurve = IntPtr.Zero;
|
|
|
emitterData.pLPFDirectCurve = IntPtr.Zero;
|
|
|
emitterData.pLPFReverbCurve = IntPtr.Zero;
|
|
|
emitterData.pReverbCurve = IntPtr.Zero;
|
|
|
emitterData.CurveDistanceScaler = 1.0f;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
}
|
|
|
|