Exemple #1
0
        public IALSource GenSource(IALBuffer buffer, bool isXACT)
        {
            uint result;

            AL10.alGenSources(1, out result);
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            if (result == 0)
            {
                return(null);
            }
            AL10.alSourcei(
                result,
                AL10.AL_BUFFER,
                (int)(buffer as OpenALBuffer).Handle
                );
            AL10.alSourcef(
                result,
                AL10.AL_REFERENCE_DISTANCE,
                AudioDevice.DistanceScale
                );
            if (isXACT)
            {
                AL10.alSourcef(
                    result,
                    AL10.AL_MAX_GAIN,
                    AudioDevice.MAX_GAIN_VALUE
                    );
            }
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            return(new OpenALSource(result));
        }
Exemple #2
0
        /// <summary>
        /// Create an <see cref="AlStaticSource"/> for this context.
        /// </summary>
        public AlStaticSource CreateStaticSource()
        {
            ALC10.alcMakeContextCurrent(Handle);
            AL10.alGenSources(1, out var name);
            AlHelper.AlAlwaysCheckError("Call to alGenSources failed.");
            var source = new AlStaticSource(name, this);

            _sources.Add(source);
            return(source);
        }
Exemple #3
0
        public IALSource GenSource()
        {
            uint result;

            AL10.alGenSources((IntPtr)1, out result);
            if (result == 0)
            {
                return(null);
            }
            return(new OpenALSource(result));
        }
Exemple #4
0
        public SoundChannel(int index)
        {
            soundBufferManager = SoundBufferManager.Instance;
            this.index         = index;
            reserved           = false;
            leftVolume         = DEFAULT_VOLUME;
            rightVolume        = DEFAULT_VOLUME;
            alSource           = AL10.alGenSources();
            sampleRate         = DEFAULT_SAMPLE_RATE;
            updateNumberBlockingBuffers();

            AL10.alSourcei(alSource, AL10.AL_LOOPING, AL10.AL_FALSE);
        }
Exemple #5
0
        public IALSource GenSource()
        {
            uint result;

            AL10.alGenSources(1, out result);
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            if (result == 0)
            {
                return(null);
            }
            return(new OpenALSource(result));
        }
Exemple #6
0
        public OpenAlSoundEngine()
        {
            Console.WriteLine("Using OpenAL sound engine");

            if (Game.Settings.Sound.Device != null)
            {
                Console.WriteLine("Using device `{0}`", Game.Settings.Sound.Device);
            }
            else
            {
                Console.WriteLine("Using default device");
            }

            device = ALC10.alcOpenDevice(Game.Settings.Sound.Device);
            if (device == IntPtr.Zero)
            {
                Console.WriteLine("Failed to open device. Falling back to default");
                device = ALC10.alcOpenDevice(null);
                if (device == IntPtr.Zero)
                {
                    throw new InvalidOperationException("Can't create OpenAL device");
                }
            }

            var ctx = ALC10.alcCreateContext(device, null);

            if (ctx == IntPtr.Zero)
            {
                throw new InvalidOperationException("Can't create OpenAL context");
            }
            ALC10.alcMakeContextCurrent(ctx);

            for (var i = 0; i < PoolSize; i++)
            {
                var source = 0U;
                AL10.alGenSources(new IntPtr(1), out source);
                if (AL10.alGetError() != AL10.AL_NO_ERROR)
                {
                    Log.Write("sound", "Failed generating OpenAL source {0}", i);
                    return;
                }

                sourcePool.Add(source, new PoolSlot()
                {
                    IsActive = false
                });
            }
        }
Exemple #7
0
        public IALSource GenSource(IALBuffer buffer)
        {
            uint result;

            AL10.alGenSources((IntPtr)1, out result);
            if (result == 0)
            {
                return(null);
            }
            AL10.alSourcei(
                result,
                AL10.AL_BUFFER,
                (int)(buffer as OpenALBuffer).Handle
                );
            return(new OpenALSource(result));
        }
Exemple #8
0
        public static void Initialize()
        {
            // Populate the device lists
            PlaybackDevice.PopulateDeviceList();
            if (PlaybackDevice.Devices.Count == 0)
            {
                throw new AudioException("There are no audio playback devices available");
            }
            LDEBUG("Available audio playback devices:");
            foreach (var dev in PlaybackDevice.Devices)
            {
                LDEBUG($"   {dev.Identifier}");
            }

            // Open the default playback device
            Device = ALC10.alcOpenDevice(PlaybackDevice.Devices[0].Identifier);
            ALUtils.CheckALCError();
            if (Device == IntPtr.Zero)
            {
                throw new AudioException("Unable to open default audio playback device");
            }

            // Create the al context and set it as active
            Context = ALC10.alcCreateContext(Device, new int[2] {
                0, 0
            });                                                                        // Two 0s tell OpenAL no special attribs
            ALUtils.CheckALCError();
            if (Context == IntPtr.Zero)
            {
                throw new AudioException("Unable to create audio context");
            }
            ALC10.alcMakeContextCurrent(Context);
            ALUtils.CheckALCError();

            // Generate audio sources
            AL10.alGenSources(MAX_SOURCE_COUNT, s_allSources);
            ALUtils.CheckALError("unable to generate audio sources");
            foreach (var src in s_allSources)
            {
                s_availableSources.Push(src);
            }

            // Report
            LINFO("Started OpenAL audio engine.");
            LINFO($"    Device: {PlaybackDevice.Devices[0].Identifier}.");
        }
Exemple #9
0
        public IALSource GenSource()
        {
            uint result;

            AL10.alGenSources(1, out result);
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            if (result == 0)
            {
                return(null);
            }
            AL10.alSourcef(
                result,
                AL10.AL_REFERENCE_DISTANCE,
                AudioDevice.DistanceScale
                );
            return(new OpenALSource(result));
        }
Exemple #10
0
        public IALSource GenSource(IALBuffer buffer)
        {
            uint result;

            AL10.alGenSources(1, out result);
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            if (result == 0)
            {
                return(null);
            }
            AL10.alSourcei(
                result,
                AL10.AL_BUFFER,
                (int)(buffer as OpenALBuffer).Handle
                );
#if VERBOSE_AL_DEBUGGING
            CheckALError();
#endif
            return(new OpenALSource(result));
        }
Exemple #11
0
        public override void Play()
        {
            if (State != SoundState.Stopped)
            {
                return;                 // No-op if we're already playing.
            }

            if (INTERNAL_alSource != 0)
            {
                // The sound has stopped, but hasn't cleaned up yet...
                AL10.alSourceStop(INTERNAL_alSource);
                AL10.alDeleteSources((IntPtr)1, ref INTERNAL_alSource);
                INTERNAL_alSource = 0;
            }
            while (queuedBuffers.Count > 0)
            {
                availableBuffers.Enqueue(queuedBuffers.Dequeue());
            }

            AL10.alGenSources((IntPtr)1, out INTERNAL_alSource);
            if (INTERNAL_alSource == 0)
            {
                System.Console.WriteLine("WARNING: AL SOURCE WAS NOT AVAILABLE. SKIPPING.");
                return;
            }

            // Queue the buffers to this source
            while (buffersToQueue.Count > 0)
            {
                uint nextBuf = buffersToQueue.Dequeue();
                queuedBuffers.Enqueue(nextBuf);
                AL10.alSourceQueueBuffers(
                    INTERNAL_alSource,
                    (IntPtr)1,
                    ref nextBuf
                    );
            }

            // Apply Pan/Position
            if (INTERNAL_positionalAudio)
            {
                INTERNAL_positionalAudio = false;
                AL10.alSource3f(
                    INTERNAL_alSource,
                    AL10.AL_POSITION,
                    position.X,
                    position.Y,
                    position.Z
                    );
            }
            else
            {
                Pan = Pan;
            }

            // Reassign Properties, in case the AL properties need to be applied.
            Volume   = Volume;
            IsLooped = IsLooped;
            Pitch    = Pitch;

            // Finally.
            AL10.alSourcePlay(INTERNAL_alSource);
            OpenALDevice.Instance.dynamicInstancePool.Add(this);

            // ... but wait! What if we need moar buffers?
            if (PendingBufferCount <= 2 && BufferNeeded != null)
            {
                BufferNeeded(this, null);
            }
        }
Exemple #12
0
        public virtual void Play()
        {
            if (State != SoundState.Stopped && INTERNAL_alSource != 0)             // FIXME: alSource check part of timer hack!
            {
                // FIXME: Is this XNA4 behavior?
                Stop();
            }

            if (INTERNAL_delayMS != 0 && !INTERNAL_timer.IsRunning)
            {
                INTERNAL_timer.Start();
            }
            if (INTERNAL_timer.ElapsedMilliseconds < INTERNAL_delayMS)
            {
                return;                 // We'll be back...
            }
            INTERNAL_timer.Stop();
            INTERNAL_timer.Reset();

            if (INTERNAL_alSource != 0)
            {
                // The sound has stopped, but hasn't cleaned up yet...
                AL10.alSourceStop(INTERNAL_alSource);
                AL10.alDeleteSources((IntPtr)1, ref INTERNAL_alSource);
                INTERNAL_alSource = 0;
            }

            AL10.alGenSources((IntPtr)1, out INTERNAL_alSource);
            if (INTERNAL_alSource == 0)
            {
                System.Console.WriteLine("WARNING: AL SOURCE WAS NOT AVAILABLE. SKIPPING.");
                return;
            }

            // Attach the buffer to this source
            AL10.alSourcei(
                INTERNAL_alSource,
                AL10.AL_BUFFER,
                (int)INTERNAL_parentEffect.INTERNAL_buffer
                );

            // Apply Pan/Position
            if (INTERNAL_positionalAudio)
            {
                INTERNAL_positionalAudio = false;
                AL10.alSource3f(
                    INTERNAL_alSource,
                    AL10.AL_POSITION,
                    position.X,
                    position.Y,
                    position.Z
                    );
            }
            else
            {
                Pan = Pan;
            }

            // Reassign Properties, in case the AL properties need to be applied.
            Volume   = Volume;
            IsLooped = IsLooped;
            Pitch    = Pitch;

            // Apply EFX
            if (INTERNAL_alEffectSlot != 0)
            {
                AL10.alSource3i(
                    INTERNAL_alSource,
                    EFX.AL_AUXILIARY_SEND_FILTER,
                    (int)INTERNAL_alEffectSlot,
                    0,
                    0
                    );
            }

            AL10.alSourcePlay(INTERNAL_alSource);
        }
Exemple #13
0
 protected AudioSource()
 {
     AL10.alGenSources(1, out var source);
     Source = source;
     Check();
 }
Exemple #14
0
 public AudioSource()
 {
     AL10.alGenSources(1, out _handle);
     AudioSystem.alCheckError();
 }
Exemple #15
0
 protected AudioSource()
 {
     AL10.alGenSources(1, out Source);
     Check();
 }