コード例 #1
0
        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");
            }
        }
コード例 #2
0
ファイル: OpenAL.cs プロジェクト: Jypeli-JYU/Jypeli
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
    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));
    }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
        }