anx.framework/SoundSystems/ANX.SoundSystem.OpenAL/OpenALSoundEffectInstance.cs
SND\AstrorEnales_cp ef734ddcd3 Implemented the MediaPlayer and MediaQueue classes as preparation for native Song playback.
Also added the FrameworkDispatcher calls in the Game class.
Checking for possible fire and forget sound instances to be disposed in the FrameworkDispatcher update chain.
2015-03-15 01:11:17 +01:00

145 lines
3.1 KiB
C#

using System;
using ANX.Framework.Audio;
using ANX.Framework.NonXNA.SoundSystem;
using OpenTK.Audio.OpenAL;
// 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.OpenAL
{
public class OpenALSoundEffectInstance : ISoundEffectInstance
{
#region Private
private readonly OpenALSoundEffect parent;
private float currentPan;
private int handle;
#endregion
#region Public
public bool IsLooped
{
get
{
bool result;
AL.GetSource(handle, ALSourceb.Looping, out result);
return result;
}
set { AL.Source(handle, ALSourceb.Looping, value); }
}
public float Pan
{
get { return currentPan; }
set
{
currentPan = value;
// TODO: set actual parameter
}
}
public float Pitch
{
get
{
float result;
AL.GetSource(handle, ALSourcef.Pitch, out result);
return result;
}
set { AL.Source(handle, ALSourcef.Pitch, value); }
}
public SoundState State { get; private set; }
public float Volume
{
get
{
float result;
AL.GetSource(handle, ALSourcef.Gain, out result);
return result;
}
set { AL.Source(handle, ALSourcef.Gain, value); }
}
#endregion
#region Constructor
internal OpenALSoundEffectInstance(OpenALSoundEffect setParent)
{
parent = setParent;
State = SoundState.Stopped;
handle = AL.GenSource();
AL.Source(handle, ALSourcei.Buffer, parent.bufferHandle);
IsLooped = false;
Pitch = 1f;
Volume = 1f;
Pan = 0f;
ALError error = AL.GetError();
if (error != ALError.NoError)
throw new Exception("OpenAL error " + error + ": " + AL.GetErrorString(error));
}
#endregion
#region Play
public void Play()
{
if (State == SoundState.Playing)
return;
State = SoundState.Playing;
AL.SourcePlay(handle);
}
#endregion
#region Pause
public void Pause()
{
if (State == SoundState.Paused)
return;
State = SoundState.Paused;
AL.SourcePause(handle);
}
#endregion
#region Stop
public void Stop(bool immediate)
{
if (State == SoundState.Stopped || immediate == false)
return;
State = SoundState.Stopped;
AL.SourceStop(handle);
}
#endregion
#region Resume
public void Resume()
{
if (State == SoundState.Playing)
return;
State = SoundState.Playing;
AL.SourcePlay(handle);
}
#endregion
#region Apply3D (TODO)
public void Apply3D(AudioListener[] listeners, AudioEmitter emitter)
{
throw new NotImplementedException();
}
#endregion
#region Dispose
public void Dispose()
{
AL.DeleteSource(handle);
handle = -1;
}
#endregion
}
}