// Copyright 2008 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #pragma once #include #include "AudioCommon/SoundStream.h" #include "Common/Event.h" #include "Core/Core.h" #include "Core/HW/AudioInterface.h" #include "Core/HW/SystemTimers.h" #if defined HAVE_OPENAL && HAVE_OPENAL #ifdef _WIN32 #include #include #include #elif defined __APPLE__ #include #include #else #include #include #include #endif #define SFX_MAX_SOURCE 1 #define OAL_MAX_BUFFERS 32 #define OAL_MAX_SAMPLES 256 #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_STEREO_FLOAT STEREO_CHANNELS* SIZE_FLOAT #define FRAME_STEREO_INT32 STEREO_CHANNELS* SIZE_INT32 #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 // 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 { #if defined HAVE_OPENAL && HAVE_OPENAL public: OpenALStream() : uiSource(0) {} bool Start() override; void SoundLoop() override; void SetVolume(int volume) override; void Stop() override; void Clear(bool mute) override; void Update() override; static bool isValid() { return true; } private: std::thread thread; Common::Flag m_run_thread; Common::Event soundSyncEvent; short realtimeBuffer[OAL_MAX_SAMPLES * STEREO_CHANNELS]; float sampleBuffer[OAL_MAX_SAMPLES * SURROUND_CHANNELS * OAL_MAX_BUFFERS]; ALuint uiBuffers[OAL_MAX_BUFFERS]; ALuint uiSource; ALfloat fVolume; u8 numBuffers; #endif // HAVE_OPENAL };