1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // Copyright 2008 Dolphin Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #pragma once
- #include <thread>
- #include "AudioCommon/SoundStream.h"
- #include "Common/Event.h"
- #include "Core/Core.h"
- #include "Core/HW/AudioInterface.h"
- #include "Core/HW/SystemTimers.h"
- #ifdef _WIN32
- #include <al.h>
- #include <alc.h>
- #include <alext.h>
- // OpenAL requires a minimum of two buffers, three or more recommended
- #define OAL_BUFFERS 3
- #define OAL_MAX_FRAMES 4096
- #define STEREO_CHANNELS 2
- #define SURROUND_CHANNELS 6 // number of channels in surround mode
- #define SIZE_SHORT 2
- #define SIZE_INT32 4
- #define SIZE_FLOAT 4 // size of a float in bytes
- #define FRAME_STEREO_SHORT STEREO_CHANNELS* SIZE_SHORT
- #define FRAME_SURROUND_FLOAT SURROUND_CHANNELS* SIZE_FLOAT
- #define FRAME_SURROUND_SHORT SURROUND_CHANNELS* SIZE_SHORT
- #define FRAME_SURROUND_INT32 SURROUND_CHANNELS* SIZE_INT32
- #endif // _WIN32
- // From AL_EXT_float32
- #ifndef AL_FORMAT_STEREO_FLOAT32
- #define AL_FORMAT_STEREO_FLOAT32 0x10011
- #endif
- // From AL_EXT_MCFORMATS
- #ifndef AL_FORMAT_51CHN16
- #define AL_FORMAT_51CHN16 0x120B
- #endif
- #ifndef AL_FORMAT_51CHN32
- #define AL_FORMAT_51CHN32 0x120C
- #endif
- // Only X-Fi on Windows supports the alext AL_FORMAT_STEREO32 alext for now,
- // but it is not documented or in "OpenAL/include/al.h".
- #ifndef AL_FORMAT_STEREO32
- #define AL_FORMAT_STEREO32 0x1203
- #endif
- class OpenALStream final : public SoundStream
- {
- #ifdef _WIN32
- public:
- OpenALStream() = default;
- ~OpenALStream() override;
- bool Init() override;
- void SetVolume(int volume) override;
- bool SetRunning(bool running) override;
- static bool IsValid();
- private:
- void SoundLoop();
- std::thread m_thread;
- Common::Flag m_run_thread;
- std::vector<short> m_realtime_buffer;
- std::array<ALuint, OAL_BUFFERS> m_buffers{};
- ALuint m_source = 0;
- ALfloat m_volume = 1;
- #endif // _WIN32
- };
|