OpenALStream.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2008 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <thread>
  5. #include "AudioCommon/SoundStream.h"
  6. #include "Common/Event.h"
  7. #include "Core/Core.h"
  8. #include "Core/HW/AudioInterface.h"
  9. #include "Core/HW/SystemTimers.h"
  10. #ifdef _WIN32
  11. #include <al.h>
  12. #include <alc.h>
  13. #include <alext.h>
  14. // OpenAL requires a minimum of two buffers, three or more recommended
  15. #define OAL_BUFFERS 3
  16. #define OAL_MAX_FRAMES 4096
  17. #define STEREO_CHANNELS 2
  18. #define SURROUND_CHANNELS 6 // number of channels in surround mode
  19. #define SIZE_SHORT 2
  20. #define SIZE_INT32 4
  21. #define SIZE_FLOAT 4 // size of a float in bytes
  22. #define FRAME_STEREO_SHORT STEREO_CHANNELS* SIZE_SHORT
  23. #define FRAME_SURROUND_FLOAT SURROUND_CHANNELS* SIZE_FLOAT
  24. #define FRAME_SURROUND_SHORT SURROUND_CHANNELS* SIZE_SHORT
  25. #define FRAME_SURROUND_INT32 SURROUND_CHANNELS* SIZE_INT32
  26. #endif // _WIN32
  27. // From AL_EXT_float32
  28. #ifndef AL_FORMAT_STEREO_FLOAT32
  29. #define AL_FORMAT_STEREO_FLOAT32 0x10011
  30. #endif
  31. // From AL_EXT_MCFORMATS
  32. #ifndef AL_FORMAT_51CHN16
  33. #define AL_FORMAT_51CHN16 0x120B
  34. #endif
  35. #ifndef AL_FORMAT_51CHN32
  36. #define AL_FORMAT_51CHN32 0x120C
  37. #endif
  38. // Only X-Fi on Windows supports the alext AL_FORMAT_STEREO32 alext for now,
  39. // but it is not documented or in "OpenAL/include/al.h".
  40. #ifndef AL_FORMAT_STEREO32
  41. #define AL_FORMAT_STEREO32 0x1203
  42. #endif
  43. class OpenALStream final : public SoundStream
  44. {
  45. #ifdef _WIN32
  46. public:
  47. OpenALStream() = default;
  48. ~OpenALStream() override;
  49. bool Init() override;
  50. void SetVolume(int volume) override;
  51. bool SetRunning(bool running) override;
  52. static bool IsValid();
  53. private:
  54. void SoundLoop();
  55. std::thread m_thread;
  56. Common::Flag m_run_thread;
  57. std::vector<short> m_realtime_buffer;
  58. std::array<ALuint, OAL_BUFFERS> m_buffers{};
  59. ALuint m_source = 0;
  60. ALfloat m_volume = 1;
  61. #endif // _WIN32
  62. };