private unsafe PinMameController(IInputContext input) { _pinMame = PinMame.PinMame.Instance(); _pinMame.OnGameStarted += OnGameStarted; _pinMame.OnDisplayAvailable += OnDisplayAvailable; _pinMame.OnDisplayUpdated += OnDisplayUpdated; _pinMame.OnAudioAvailable += OnAudioAvailable; _pinMame.OnAudioUpdated += OnAudioUpdated; _pinMame.OnConsoleDataUpdated += OnConsoleDataUpdated; _pinMame.OnGameEnded += OnGameEnded; _pinMame.IsKeyPressed += IsKeyPressed; _pinMame.SetHandleKeyboard(true); _dmdController = DmdController.Instance(); _input = input; foreach (var keyboard in _input.Keyboards) { keyboard.KeyDown += (arg1, arg2, arg3) => { if (_keycodeMap.TryGetValue(arg2, out var keycode)) { Logger.Trace($"KeyDown() {keycode} ({(int)keycode})"); _keypress[(int)keycode] = 1; } }; keyboard.KeyUp += (arg1, arg2, arg3) => { if (_keycodeMap.TryGetValue(arg2, out var keycode)) { Logger.Trace($"KeyUp() {keycode} ({(int)keycode})"); _keypress[(int)keycode] = 0; } }; } _al = AL.GetApi(true); ALContext alContext = ALContext.GetApi(true); var device = alContext.OpenDevice(""); if (device != null) { alContext.MakeContextCurrent( alContext.CreateContext(device, null)); _audioSource = _al.GenSource(); _audioBuffers = _al.GenBuffers(_maxAudioBuffers); } else { Logger.Error("PinMameController(): Could not create device"); } }
internal static void Init() { // Jos initialisointia on jo kutsuttu. if (initialized) { return; } initialized = true; // Don't initialize OpenAL in headless mode. if (CommandLineOptions.Headless ?? Game.Instance?.Headless ?? false) { return; } ALContext alc = null; try { // Yritetään ladata OpenAL Soft. // Jos softia ei ole saatavilla (Esim. M1 tms. ARM suorittimella varustettu kone), // Koitetaan sitten käyttää laitteen omaa OpenAL kirjastoa. // TODO: Kumpi on oikeasti parempi? Pitäisikö logiikan mennä toisinpäin? alc = ALContext.GetApi(true); al = AL.GetApi(true); } catch { alc = ALContext.GetApi(); al = AL.GetApi(); } var device = alc.OpenDevice(""); if (device == null) { al = null; throw new AudioDeviceException("Unable to initialize OpenAL device."); } var context = alc.CreateContext(device, null); alc.MakeContextCurrent(context); al.DistanceModel(DistanceModel.InverseDistance); al.GetError(); al.SetListenerProperty(ListenerVector3.Position, 0, 0, 1); }
public AudioOutput(int channels = 1, int sampleRate = 44100) { if (channels < 1 || channels > 2) { throw new ArgumentOutOfRangeException(nameof(channels)); } if (sampleRate < 2000 || sampleRate > 200000) { throw new ArgumentOutOfRangeException(nameof(sampleRate)); } try { al = AL.GetApi(true); alContext = ALContext.GetApi(true); } catch { al = AL.GetApi(false); alContext = ALContext.GetApi(false); } device = alContext.OpenDevice(""); Available = device != null; if (Available) { context = alContext.CreateContext(device, null); alContext.MakeContextCurrent(context); if (al.GetError() != AudioError.NoError) { Available = false; if (context != null) { alContext.DestroyContext(context); } alContext.CloseDevice(device); al.Dispose(); alContext.Dispose(); disposed = true; return; } source = al.GenSource(); al.SetSourceProperty(source, SourceBoolean.Looping, true); al.SetSourceProperty(source, SourceFloat.Gain, 1.0f); } }
public unsafe void GetEnumerationContextStringList() { using var alc = ALContext.GetApi(true); var dev = alc.OpenDevice(string.Empty); if (dev != null && alc.TryGetExtension(dev, out Enumeration ext)) { ext.GetStringList(dev, Extensions.Enumeration.GetEnumerationContextStringList.DeviceSpecifiers); } else { throw new($"dev {(nint) dev}, ext not loaded"); } Assert.True(alc.CloseDevice(dev)); }
protected override bool OnStart() { try { _al = AL.GetApi(); _alc = ALContext.GetApi(); } catch (Exception ex) { XPlane.Trace.WriteLine($"[OpenAL Sample] Failed to initialize Open AL: " + ex); return(false); } _flightLoop = FlightLoop.Create(FlightLoopPhaseType.BeforeFlightModel, InitSound); _flightLoop.Schedule(-1, false); Menu.PluginsMenu .AddItem("OpenAL Sample (Private Context)", item => item.CreateSubMenu() .AddItem("Play Sound", out _, PlaySound) ); return(true); }
static unsafe void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Exactly one argument should be given: the path to the .wav file that should be played."); return; } var filePath = args[0]; ReadOnlySpan <byte> file = File.ReadAllBytes(filePath); int index = 0; if (file[index++] != 'R' || file[index++] != 'I' || file[index++] != 'F' || file[index++] != 'F') { Console.WriteLine("Given file is not in RIFF format"); return; } var chunkSize = BinaryPrimitives.ReadInt32LittleEndian(file.Slice(index, 4)); index += 4; if (file[index++] != 'W' || file[index++] != 'A' || file[index++] != 'V' || file[index++] != 'E') { Console.WriteLine("Given file is not in WAVE format"); return; } short numChannels = -1; int sampleRate = -1; int byteRate = -1; short blockAlign = -1; short bitsPerSample = -1; BufferFormat format = 0; var alc = ALContext.GetApi(); var al = AL.GetApi(); var device = alc.OpenDevice(""); if (device == null) { Console.WriteLine("Could not create device"); return; } var context = alc.CreateContext(device, null); alc.MakeContextCurrent(context); al.GetError(); var source = al.GenSource(); var buffer = al.GenBuffer(); al.SetSourceProperty(source, SourceBoolean.Looping, true); while (index + 4 < file.Length) { var identifier = "" + (char)file[index++] + (char)file[index++] + (char)file[index++] + (char)file[index++]; var size = BinaryPrimitives.ReadInt32LittleEndian(file.Slice(index, 4)); index += 4; if (identifier == "fmt ") { if (size != 16) { Console.WriteLine($"Unknown Audio Format with subchunk1 size {size}"); } else { var audioFormat = BinaryPrimitives.ReadInt16LittleEndian(file.Slice(index, 2)); index += 2; if (audioFormat != 1) { Console.WriteLine($"Unknown Audio Format with ID {audioFormat}"); } else { numChannels = BinaryPrimitives.ReadInt16LittleEndian(file.Slice(index, 2)); index += 2; sampleRate = BinaryPrimitives.ReadInt32LittleEndian(file.Slice(index, 4)); index += 4; byteRate = BinaryPrimitives.ReadInt32LittleEndian(file.Slice(index, 4)); index += 4; blockAlign = BinaryPrimitives.ReadInt16LittleEndian(file.Slice(index, 2)); index += 2; bitsPerSample = BinaryPrimitives.ReadInt16LittleEndian(file.Slice(index, 2)); index += 2; if (numChannels == 1) { if (bitsPerSample == 8) { format = BufferFormat.Mono8; } else if (bitsPerSample == 16) { format = BufferFormat.Mono16; } else { Console.WriteLine($"Can't Play mono {bitsPerSample} sound."); } } else if (numChannels == 2) { if (bitsPerSample == 8) { format = BufferFormat.Stereo8; } else if (bitsPerSample == 16) { format = BufferFormat.Stereo16; } else { Console.WriteLine($"Can't Play stereo {bitsPerSample} sound."); } } else { Console.WriteLine($"Can't play audio with {numChannels} sound"); } } } } else if (identifier == "data") { var data = file.Slice(44, size); index += size; fixed(byte *pData = data) al.BufferData(buffer, format, pData, size, sampleRate); Console.WriteLine($"Read {size} bytes Data"); } else if (identifier == "JUNK") { // this exists to align things index += size; } else if (identifier == "iXML") { var v = file.Slice(index, size); var str = Encoding.ASCII.GetString(v); Console.WriteLine($"iXML Chunk: {str}"); index += size; } else { Console.WriteLine($"Unknown Section: {identifier}"); index += size; } } Console.WriteLine ( $"Success. Detected RIFF-WAVE audio file, PCM encoding. {numChannels} Channels, {sampleRate} Sample Rate, {byteRate} Byte Rate, {blockAlign} Block Align, {bitsPerSample} Bits per Sample" ); al.SetSourceProperty(source, SourceInteger.Buffer, buffer); al.SourcePlay(source); Console.WriteLine("Press Enter to Exit..."); Console.ReadLine(); al.SourceStop(source); al.DeleteSource(source); al.DeleteBuffer(buffer); alc.DestroyContext(context); alc.CloseDevice(device); al.Dispose(); alc.Dispose(); }