#pragma once

#include "ehs/EHS.h"
#include "BaseAudioDevice.h"

#include <alsa/asoundlib.h>

namespace ehs
{
	class AudioDevice : public BaseAudioDevice
	{
	private:
		snd_pcm_t* hdl;

	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;

		bool IsValid() const override;

		static AudioDevice GetDefault(const AudioDeviceType type);

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