156 lines
2.6 KiB
C#

using System;
using ANX.Framework.Audio;
using ANX.Framework.NonXNA.SoundSystem;
using SharpDX.XAudio2;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ANX.SoundSystem.Windows.XAudio
{
public class XAudioSoundEffectInstance : ISoundEffectInstance
{
#region Private
private XAudioSoundEffect parent;
private SourceVoice source;
#endregion
#region Public
public bool IsLooped
{
get
{
return false;
//throw new NotImplementedException();
}
set
{
//throw new NotImplementedException();
}
}
public float Pan
{
get
{
return 0f;
//throw new NotImplementedException();
}
set
{
//throw new NotImplementedException();
}
}
public float Pitch
{
get
{
return 1f;
//throw new NotImplementedException();
}
set
{
//throw new NotImplementedException();
}
}
public SoundState State
{
get;
private set;
}
public float Volume
{
get
{
return source.Volume;
}
set
{
source.SetVolume(value, 0);
}
}
#endregion
#region Constructor
internal XAudioSoundEffectInstance(XAudio2 device, XAudioSoundEffect setParent)
{
parent = setParent;
State = SoundState.Stopped;
var sourceVoice = new SourceVoice(device, setParent.waveFormat);
sourceVoice.SubmitSourceBuffer(setParent.audioBuffer, setParent.DecodedPacketsInfo);
sourceVoice.Start();
}
#endregion
#region Play
public void Play()
{
if (State != SoundState.Playing)
{
State = SoundState.Playing;
source.Start();
}
}
#endregion
#region Pause
public void Pause()
{
if (State != SoundState.Paused)
{
State = SoundState.Paused;
}
}
#endregion
#region Stop
public void Stop(bool immediate)
{
if (State == SoundState.Stopped)
return;
if (immediate)
{
State = SoundState.Stopped;
source.Stop();
}
}
#endregion
#region Resume
public void Resume()
{
if (State != SoundState.Playing)
{
State = SoundState.Playing;
}
}
#endregion
#region Apply3D (TODO)
public void Apply3D(AudioListener[] listeners, AudioEmitter emitter)
{
throw new NotImplementedException();
}
#endregion
#region Dispose
public void Dispose()
{
if (source != null)
{
source.Dispose();
source = null;
}
}
#endregion
}
}