#pragma once

#include "EHS.h"
#include "BaseAudioDevice.h"

#include <initguid.h>
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
#include <Audioclient.h>

struct IMMDevice;

namespace ehs
{
	class AudioDevice : public BaseAudioDevice
	{
	private:
		IMMDevice* hdl;
		IAudioClient* client;
		IAudioRenderClient* playbackClient;
		IAudioCaptureClient* captureClient;

	public:
		~AudioDevice() override;

		AudioDevice();

		AudioDevice(AudioDevice&& device) noexcept;

		AudioDevice(const AudioDevice& device);

		AudioDevice& operator=(AudioDevice&& device) noexcept;

		AudioDevice& operator=(const AudioDevice& device);

		void Release() override;

		void OpenStream() override;

		void CloseStream() override;

		UInt_64 GetAvailFrames() const override;

		Byte* Map(UInt_64* offset, UInt_64* frames) override;

		void UnMap(const UInt_64 offset, const UInt_64 frames) override;

		Str_32 GetInterfaceName_32() const;

		Str_16 GetInterfaceName_16() const;

		Str_8 GetInterfaceName_8() const;

		Str_32 GetName_32() const;

		Str_16 GetName_16() const;

		Str_8 GetName_8() const;

		bool IsValid() const override;

		static AudioDevice GetDefault(const AudioDeviceType type);

		static Array<AudioDevice> Get(const AudioDeviceType type, const AudioDeviceState state);
	};
}