public void SetSourcePitch(IALSource source, float pitch, bool clamp) { /* XNA sets pitch bounds to [-1.0f, 1.0f], each end being one octave. * OpenAL's AL_PITCH boundaries are (0.0f, INF). * Consider the function f(x) = 2 ^ x * The domain is (-INF, INF) and the range is (0, INF). * 0.0f is the original pitch for XNA, 1.0f is the original pitch for OpenAL. * Note that f(0) = 1, f(1) = 2, f(-1) = 0.5, and so on. * XNA's pitch values are on the domain, OpenAL's are on the range. * Remember: the XNA limit is arbitrarily between two octaves on the domain. * To convert, we just plug XNA pitch into f(x). * -flibit */ if (clamp && (pitch < -1.0f || pitch > 1.0f)) { throw new IndexOutOfRangeException("XNA PITCH MUST BE WITHIN [-1.0f, 1.0f]!"); } AL10.alSourcef( (source as OpenALSource).Handle, AL10.AL_PITCH, (float)Math.Pow(2, pitch) ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void StopAndDisposeSource(IALSource source) { uint handle = (source as OpenALSource).Handle; AL10.alSourceStop(handle); AL10.alDeleteSources((IntPtr)1, ref handle); }
public void ResumeSource(IALSource source) { AL10.alSourcePlay((source as OpenALSource).Handle); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void DequeueSourceBuffers( IALSource source, int buffersToDequeue, Queue <IALBuffer> errorCheck ) { uint[] bufs = new uint[buffersToDequeue]; AL10.alSourceUnqueueBuffers( (source as OpenALSource).Handle, buffersToDequeue, bufs ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif #if DEBUG // Error check our queuedBuffers list. IALBuffer[] sync = errorCheck.ToArray(); for (int i = 0; i < buffersToDequeue; i += 1) { if (bufs[i] != (sync[i] as OpenALBuffer).Handle) { throw new InvalidOperationException("Buffer desync!"); } } #endif }
public void DequeueSourceBuffers( IALSource source, int buffersToDequeue, Queue<IALBuffer> errorCheck ) { // No-op, duh. }
public void SetSourceLooped(IALSource source, bool looped) { AL10.alSourcei( (source as OpenALSource).Handle, AL10.AL_LOOPING, looped ? 1 : 0 ); }
public void SetSourceVolume(IALSource source, float volume) { AL10.alSourcef( (source as OpenALSource).Handle, AL10.AL_GAIN, volume * SoundEffect.MasterVolume ); }
public void SetSourceFilter(IALSource source, IALFilter filter) { AL10.alSourcei( (source as OpenALSource).Handle, EFX.AL_DIRECT_FILTER, (int)(filter as OpenALFilter).Handle ); }
public void GetBufferData( IALSource source, IALBuffer[] buffer, float[] samples, AudioChannels channels ) { // No-op, duh. }
public void SetSourcePan(IALSource source, float pan) { AL10.alSource3f( (source as OpenALSource).Handle, AL10.AL_POSITION, pan, 0.0f, (float)Math.Sqrt(1 - Math.Pow(pan, 2)) ); }
public void SetSourceLowPassFilter(IALSource source, float hfGain) { EFX.alFilteri(INTERNAL_alFilter, EFX.AL_FILTER_TYPE, EFX.AL_FILTER_LOWPASS); EFX.alFilterf(INTERNAL_alFilter, EFX.AL_LOWPASS_GAINHF, hfGain); AL10.alSourcei( (source as OpenALSource).Handle, EFX.AL_DIRECT_FILTER, (int)INTERNAL_alFilter ); }
public void GetBufferData( IALSource source, IALBuffer[] buffer, IntPtr samples, int samplesLen, AudioChannels channels ) { // No-op, duh. }
public void SetSourcePosition(IALSource source, Vector3 pos) { AL10.alSource3f( (source as OpenALSource).Handle, AL10.AL_POSITION, pos.X, pos.Y, pos.Z ); }
public void QueueSourceBuffer(IALSource source, IALBuffer buffer) { uint buf = (buffer as OpenALBuffer).Handle; AL10.alSourceQueueBuffers( (source as OpenALSource).Handle, (IntPtr)1, ref buf ); }
public void SetSourceHighPassFilter(IALSource source, float lfGain) { EFX.alFilteri(INTERNAL_alFilter, EFX.AL_FILTER_TYPE, EFX.AL_FILTER_HIGHPASS); EFX.alFilterf(INTERNAL_alFilter, EFX.AL_HIGHPASS_GAINLF, lfGain); AL10.alSourcei( (source as OpenALSource).Handle, EFX.AL_DIRECT_FILTER, (int)INTERNAL_alFilter ); }
public void SetSourceReverb(IALSource source, IALReverb reverb) { AL10.alSource3i( (source as OpenALSource).Handle, EFX.AL_AUXILIARY_SEND_FILTER, (int)(reverb as OpenALReverb).SlotHandle, 0, 0 ); }
public void SetSourceVolume(IALSource source, float volume) { AL10.alSourcef( (source as OpenALSource).Handle, AL10.AL_GAIN, volume * SoundEffect.MasterVolume // FIXME: alListener(AL_GAIN) -flibit ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public int CheckProcessedBuffers(IALSource source) { int result; AL10.alGetSourcei( (source as OpenALSource).Handle, AL10.AL_BUFFERS_PROCESSED, out result ); return(result); }
public void SetSourceLooped(IALSource source, bool looped) { AL10.alSourcei( (source as OpenALSource).Handle, AL10.AL_LOOPING, looped ? 1 : 0 ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void Stop() { if (INTERNAL_alSource != null) { // TODO: GraphicsResource-like reference management -flibit if (AudioDevice.ALDevice != null) { AudioDevice.ALDevice.StopAndDisposeSource(INTERNAL_alSource); } INTERNAL_alSource = null; } }
public virtual void Play() { if (State != SoundState.Stopped) { return; } if (INTERNAL_alSource != null) { // The sound has stopped, but hasn't cleaned up yet... AudioDevice.ALDevice.StopAndDisposeSource(INTERNAL_alSource); INTERNAL_alSource = null; } INTERNAL_alSource = AudioDevice.ALDevice.GenSource( INTERNAL_parentEffect.INTERNAL_buffer ); if (INTERNAL_alSource == null) { FNAPlatform.Log("WARNING: AL SOURCE WAS NOT AVAILABLE. SKIPPING."); return; } // Apply Pan/Position if (INTERNAL_positionalAudio) { INTERNAL_positionalAudio = false; AudioDevice.ALDevice.SetSourcePosition( INTERNAL_alSource, position ); } else { Pan = Pan; } // Reassign Properties, in case the AL properties need to be applied. Volume = Volume; IsLooped = IsLooped; Pitch = Pitch; // Apply EFX if (INTERNAL_alReverb != null) { AudioDevice.ALDevice.SetSourceReverb( INTERNAL_alSource, INTERNAL_alReverb ); } AudioDevice.ALDevice.PlaySource(INTERNAL_alSource); }
public SoundState GetSourceState(IALSource source) { /* FIXME: This return value is highly volatile! * You can't necessarily do Stopped, because then stuff like Song * explodes, but SoundState.Playing doesn't make a whole lot of * sense either. This at least prevents annoyances like Song errors * from happening and, for the most part, claims to be "playing" * depending on how you ask for a source's state. * -flibit */ return(SoundState.Paused); }
public void SetSourceReverb(IALSource source, IALReverb reverb) { AL10.alSource3i( (source as OpenALSource).Handle, EFX.AL_AUXILIARY_SEND_FILTER, (int)(reverb as OpenALReverb).SlotHandle, 0, 0 ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void StopAndDisposeSource(IALSource source) { uint handle = (source as OpenALSource).Handle; AL10.alSourceStop(handle); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif AL10.alDeleteSources(1, ref handle); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void QueueSourceBuffer(IALSource source, IALBuffer buffer) { uint buf = (buffer as OpenALBuffer).Handle; AL10.alSourceQueueBuffers( (source as OpenALSource).Handle, 1, ref buf ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourceHighPassFilter(IALSource source, float lfGain) { EFX.alFilteri(INTERNAL_alFilter, EFX.AL_FILTER_TYPE, EFX.AL_FILTER_HIGHPASS); EFX.alFilterf(INTERNAL_alFilter, EFX.AL_HIGHPASS_GAINLF, lfGain); AL10.alSourcei( (source as OpenALSource).Handle, EFX.AL_DIRECT_FILTER, (int)INTERNAL_alFilter ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourcePosition(IALSource source, Vector3 pos) { AL10.alSource3f( (source as OpenALSource).Handle, AL10.AL_POSITION, pos.X, pos.Y, pos.Z ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourcePan(IALSource source, float pan) { AL10.alSource3f( (source as OpenALSource).Handle, AL10.AL_POSITION, pan, 0.0f, (float)-Math.Sqrt(1 - Math.Pow(pan, 2)) ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public int CheckProcessedBuffers(IALSource source) { int result; AL10.alGetSourcei( (source as OpenALSource).Handle, AL10.AL_BUFFERS_PROCESSED, out result ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif return(result); }
public void Stop() { if (INTERNAL_alSource != null) { // TODO: GraphicsResource-like reference management -flibit if (AudioDevice.ALDevice != null) { AudioDevice.ALDevice.StopAndDisposeSource(INTERNAL_alSource); DynamicSoundEffectInstance dsfi = this as DynamicSoundEffectInstance; if (dsfi != null && AudioDevice.DynamicInstancePool.Contains(dsfi)) { AudioDevice.DynamicInstancePool.Remove(dsfi); } } INTERNAL_alSource = null; } }
public void PlaySource(IALSource source) { // No-op, duh. }
public void ResumeSource(IALSource source) { // No-op, duh. }
public void SetSourceVolume(IALSource source, float volume) { // No-op, duh. }
public void SetSourcePan(IALSource source, float pan) { // No-op, duh. }
public void SetSourcePitch(IALSource source, float pitch, bool clamp) { // No-op, duh. }
public void SetSourceLowPassFilter(IALSource source, float hfGain) { // No-op, duh. }
public void SetSourceLowPassFilter(IALSource source, float hfGain) { EFX.alFilteri(INTERNAL_alFilter, EFX.AL_FILTER_TYPE, EFX.AL_FILTER_LOWPASS); EFX.alFilterf(INTERNAL_alFilter, EFX.AL_LOWPASS_GAINHF, hfGain); AL10.alSourcei( (source as OpenALSource).Handle, EFX.AL_DIRECT_FILTER, (int) INTERNAL_alFilter ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void QueueSourceBuffer(IALSource source, IALBuffer buffer) { uint buf = (buffer as OpenALBuffer).Handle; AL10.alSourceQueueBuffers( (source as OpenALSource).Handle, (IntPtr) 1, ref buf ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public SoundState GetSourceState(IALSource source) { int state; AL10.alGetSourcei( (source as OpenALSource).Handle, AL10.AL_SOURCE_STATE, out state ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif if (state == AL10.AL_PLAYING) { return SoundState.Playing; } else if (state == AL10.AL_PAUSED) { return SoundState.Paused; } return SoundState.Stopped; }
public void DequeueSourceBuffers( IALSource source, int buffersToDequeue, Queue<IALBuffer> errorCheck ) { uint[] bufs = new uint[buffersToDequeue]; AL10.alSourceUnqueueBuffers( (source as OpenALSource).Handle, (IntPtr) buffersToDequeue, bufs ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif #if DEBUG // Error check our queuedBuffers list. IALBuffer[] sync = errorCheck.ToArray(); for (int i = 0; i < buffersToDequeue; i += 1) { if (bufs[i] != (sync[i] as OpenALBuffer).Handle) { throw new Exception("Buffer desync!"); } } #endif }
public int CheckProcessedBuffers(IALSource source) { int result; AL10.alGetSourcei( (source as OpenALSource).Handle, AL10.AL_BUFFERS_PROCESSED, out result ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif return result; }
public void SetSourcePan(IALSource source, float pan) { AL10.alSource3f( (source as OpenALSource).Handle, AL10.AL_POSITION, pan, 0.0f, (float) Math.Sqrt(1 - Math.Pow(pan, 2)) ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourceHighPassFilter(IALSource source, float lfGain) { // No-op, duh. }
public void SetSourcePitch(IALSource source, float pitch, bool clamp) { /* XNA sets pitch bounds to [-1.0f, 1.0f], each end being one octave. * OpenAL's AL_PITCH boundaries are (0.0f, INF). * Consider the function f(x) = 2 ^ x * The domain is (-INF, INF) and the range is (0, INF). * 0.0f is the original pitch for XNA, 1.0f is the original pitch for OpenAL. * Note that f(0) = 1, f(1) = 2, f(-1) = 0.5, and so on. * XNA's pitch values are on the domain, OpenAL's are on the range. * Remember: the XNA limit is arbitrarily between two octaves on the domain. * To convert, we just plug XNA pitch into f(x). * -flibit */ if (clamp && (pitch < -1.0f || pitch > 1.0f)) { throw new Exception("XNA PITCH MUST BE WITHIN [-1.0f, 1.0f]!"); } AL10.alSourcef( (source as OpenALSource).Handle, AL10.AL_PITCH, (float) Math.Pow(2, pitch) ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourceReverb(IALSource source, IALReverb reverb) { // No-op, duh. }
public void SetSourcePosition(IALSource source, Vector3 pos) { // No-op, duh. }
public void SetSourceReverb(IALSource source, IALReverb reverb) { AL10.alSource3i( (source as OpenALSource).Handle, EFX.AL_AUXILIARY_SEND_FILTER, (int) (reverb as OpenALReverb).SlotHandle, 0, 0 ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void SetSourceLooped(IALSource source, bool looped) { // No-op, duh. }
public void SetSourceVolume(IALSource source, float volume) { AL10.alSourcef( (source as OpenALSource).Handle, AL10.AL_GAIN, volume * SoundEffect.MasterVolume ); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public SoundState GetSourceState(IALSource source) { /* FIXME: This return value is highly volatile! * You can't necessarily do Stopped, because then stuff like Song * explodes, but SoundState.Playing doesn't make a whole lot of * sense either. This at least prevents annoyances like Song errors * from happening and, for the most part, claims to be "playing" * depending on how you ask for a source's state. * -flibit */ return SoundState.Paused; }
public void StopAndDisposeSource(IALSource source) { uint handle = (source as OpenALSource).Handle; AL10.alSourceStop(handle); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif AL10.alDeleteSources((IntPtr) 1, ref handle); #if VERBOSE_AL_DEBUGGING CheckALError(); #endif }
public void PauseSource(IALSource source) { // No-op, duh. }
public void SetSourceBandPassFilter(IALSource source, float hfGain, float lfGain) { // No-op, duh. }
public int CheckProcessedBuffers(IALSource source) { return 0; }
public void QueueSourceBuffer(IALSource source, IALBuffer buffer) { // No-op, duh. }