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)); }
/// <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); }
public IALSource GenSource() { uint result; AL10.alGenSources((IntPtr)1, out result); if (result == 0) { return(null); } return(new OpenALSource(result)); }
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); }
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)); }
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 }); } }
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)); }
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}."); }
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)); }
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)); }
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); } }
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); }
protected AudioSource() { AL10.alGenSources(1, out var source); Source = source; Check(); }
public AudioSource() { AL10.alGenSources(1, out _handle); AudioSystem.alCheckError(); }
protected AudioSource() { AL10.alGenSources(1, out Source); Check(); }