// Copyright 2018 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#ifdef _WIN32
// clang-format off
#include <Windows.h>
#include <mmreg.h>
// clang-format on
#endif

#include <atomic>
#include <string>
#include <thread>
#include <vector>

#include "AudioCommon/SoundStream.h"

struct IAudioClient;
struct IAudioRenderClient;
struct IMMDevice;
struct IMMDeviceEnumerator;

class WASAPIStream final : public SoundStream
{
#ifdef _WIN32
public:
  explicit WASAPIStream();
  ~WASAPIStream();
  bool Init() override;
  bool SetRunning(bool running) override;
  void SoundLoop() override;

  static bool isValid();
  static std::vector<std::string> GetAvailableDevices();
  static IMMDevice* GetDeviceByName(std::string name);

private:
  u32 m_frames_in_buffer = 0;
  std::atomic<bool> m_running = false;
  std::atomic<bool> m_stopped = false;
  std::thread m_thread;

  IAudioClient* m_audio_client = nullptr;
  IAudioRenderClient* m_audio_renderer = nullptr;
  IMMDeviceEnumerator* m_enumerator = nullptr;
  HANDLE m_need_data_event = nullptr;
  WAVEFORMATEXTENSIBLE m_format;
#endif  // _WIN32
};