Ejemplo n.º 1
0
        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
        }
Ejemplo n.º 2
0
        public void StopAndDisposeSource(IALSource source)
        {
            uint handle = (source as OpenALSource).Handle;

            AL10.alSourceStop(handle);
            AL10.alDeleteSources((IntPtr)1, ref handle);
        }
Ejemplo n.º 3
0
        public void ResumeSource(IALSource source)
        {
            AL10.alSourcePlay((source as OpenALSource).Handle);
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
        }
Ejemplo n.º 4
0
        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
        }
Ejemplo n.º 5
0
		public void DequeueSourceBuffers(
			IALSource source,
			int buffersToDequeue,
			Queue<IALBuffer> errorCheck
		) {
			// No-op, duh.
		}
Ejemplo n.º 6
0
 public void SetSourceLooped(IALSource source, bool looped)
 {
     AL10.alSourcei(
         (source as OpenALSource).Handle,
         AL10.AL_LOOPING,
         looped ? 1 : 0
         );
 }
Ejemplo n.º 7
0
 public void SetSourceVolume(IALSource source, float volume)
 {
     AL10.alSourcef(
         (source as OpenALSource).Handle,
         AL10.AL_GAIN,
         volume * SoundEffect.MasterVolume
         );
 }
Ejemplo n.º 8
0
 public void SetSourceFilter(IALSource source, IALFilter filter)
 {
     AL10.alSourcei(
         (source as OpenALSource).Handle,
         EFX.AL_DIRECT_FILTER,
         (int)(filter as OpenALFilter).Handle
         );
 }
Ejemplo n.º 9
0
        public void DequeueSourceBuffers(
			IALSource source,
			int buffersToDequeue,
			Queue<IALBuffer> errorCheck
		)
        {
            // No-op, duh.
        }
Ejemplo n.º 10
0
 public void GetBufferData(
     IALSource source,
     IALBuffer[] buffer,
     float[] samples,
     AudioChannels channels
     )
 {
     // No-op, duh.
 }
Ejemplo n.º 11
0
 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))
         );
 }
Ejemplo n.º 12
0
 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
         );
 }
Ejemplo n.º 13
0
 public void GetBufferData(
     IALSource source,
     IALBuffer[] buffer,
     IntPtr samples,
     int samplesLen,
     AudioChannels channels
     )
 {
     // No-op, duh.
 }
Ejemplo n.º 14
0
 public void SetSourcePosition(IALSource source, Vector3 pos)
 {
     AL10.alSource3f(
         (source as OpenALSource).Handle,
         AL10.AL_POSITION,
         pos.X,
         pos.Y,
         pos.Z
         );
 }
Ejemplo n.º 15
0
        public void QueueSourceBuffer(IALSource source, IALBuffer buffer)
        {
            uint buf = (buffer as OpenALBuffer).Handle;

            AL10.alSourceQueueBuffers(
                (source as OpenALSource).Handle,
                (IntPtr)1,
                ref buf
                );
        }
Ejemplo n.º 16
0
 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
         );
 }
Ejemplo n.º 17
0
 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
         );
 }
Ejemplo n.º 18
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
        }
Ejemplo n.º 19
0
        public int CheckProcessedBuffers(IALSource source)
        {
            int result;

            AL10.alGetSourcei(
                (source as OpenALSource).Handle,
                AL10.AL_BUFFERS_PROCESSED,
                out result
                );
            return(result);
        }
Ejemplo n.º 20
0
        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
        }
Ejemplo n.º 21
0
 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;
     }
 }
Ejemplo n.º 22
0
        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);
        }
Ejemplo n.º 23
0
 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);
 }
Ejemplo n.º 24
0
        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
        }
Ejemplo n.º 25
0
        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
        }
Ejemplo n.º 26
0
        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
        }
Ejemplo n.º 27
0
        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
        }
Ejemplo n.º 28
0
        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
        }
Ejemplo n.º 29
0
        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
        }
Ejemplo n.º 30
0
        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);
        }
Ejemplo n.º 31
0
 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;
     }
 }
Ejemplo n.º 32
0
		public void GetBufferData(
			IALSource source,
			IALBuffer[] buffer,
			IntPtr samples,
			int samplesLen,
			AudioChannels channels
		) {
			// No-op, duh.
		}
Ejemplo n.º 33
0
		public void PlaySource(IALSource source)
		{
			// No-op, duh.
		}
Ejemplo n.º 34
0
		public void ResumeSource(IALSource source)
		{
			// No-op, duh.
		}
Ejemplo n.º 35
0
		public void SetSourceVolume(IALSource source, float volume)
		{
			// No-op, duh.
		}
Ejemplo n.º 36
0
		public void SetSourcePan(IALSource source, float pan)
		{
			// No-op, duh.
		}
Ejemplo n.º 37
0
		public void SetSourcePitch(IALSource source, float pitch, bool clamp)
		{
			// No-op, duh.
		}
Ejemplo n.º 38
0
		public void SetSourceLowPassFilter(IALSource source, float hfGain)
		{
			// No-op, duh.
		}
Ejemplo n.º 39
0
 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
 }
Ejemplo n.º 40
0
 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
 }
Ejemplo n.º 41
0
 public void ResumeSource(IALSource source)
 {
     AL10.alSourcePlay((source as OpenALSource).Handle);
     #if VERBOSE_AL_DEBUGGING
     CheckALError();
     #endif
 }
Ejemplo n.º 42
0
 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
 }
Ejemplo n.º 43
0
 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;
 }
Ejemplo n.º 44
0
        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
        }
Ejemplo n.º 45
0
 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;
 }
Ejemplo n.º 46
0
 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
 }
Ejemplo n.º 47
0
		public void SetSourceHighPassFilter(IALSource source, float lfGain)
		{
			// No-op, duh.
		}
Ejemplo n.º 48
0
 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
 }
Ejemplo n.º 49
0
		public void SetSourceReverb(IALSource source, IALReverb reverb)
		{
			// No-op, duh.
		}
Ejemplo n.º 50
0
 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
 }
Ejemplo n.º 51
0
		public void SetSourcePosition(IALSource source, Vector3 pos)
		{
			// No-op, duh.
		}
Ejemplo n.º 52
0
 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
 }
Ejemplo n.º 53
0
		public void SetSourceLooped(IALSource source, bool looped)
		{
			// No-op, duh.
		}
Ejemplo n.º 54
0
 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
 }
Ejemplo n.º 55
0
		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;
		}
Ejemplo n.º 56
0
 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
 }
Ejemplo n.º 57
0
		public void PauseSource(IALSource source)
		{
			// No-op, duh.
		}
Ejemplo n.º 58
0
		public void SetSourceBandPassFilter(IALSource source, float hfGain, float lfGain)
		{
			// No-op, duh.
		}
Ejemplo n.º 59
0
		public int CheckProcessedBuffers(IALSource source)
		{
			return 0;
		}
Ejemplo n.º 60
0
		public void QueueSourceBuffer(IALSource source, IALBuffer buffer)
		{
			// No-op, duh.
		}