#ifndef MXMUSICMANAGER_H
#define MXMUSICMANAGER_H

#include "decomp.h"
#include "mxaudiomanager.h"

#include <windows.h>

// VTABLE: LEGO1 0x100dc930
// SIZE 0x58
class MxMusicManager : public MxAudioManager {
public:
	MxMusicManager();
	~MxMusicManager() override;

	void Destroy() override;                                             // vtable+18
	void SetVolume(MxS32 p_volume) override;                             // vtable+2c
	virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); // vtable+30

	MxBool GetMIDIInitialized() { return m_midiInitialized; }
	void GetMIDIVolume(DWORD& p_volume)
	{
		if (midiOutGetVolume((HMIDIOUT) m_midiStreamH, &p_volume)) {
			p_volume = CalculateVolume(100);
		}
	}

	MxResult ResetStream();
	void ResetBuffer();
	MxResult InitializeMIDI(MxU8* p_data, MxS32 p_loopCount);
	void DeinitializeMIDI();
	void SetMultiplier(MxS32 p_multiplier);

private:
	void Destroy(MxBool p_fromDestructor);

	MxS32 CalculateVolume(MxS32 p_volume);
	void SetMIDIVolume();

	static void CALLBACK MidiCallbackProc(HDRVR p_hdrvr, UINT p_uMsg, DWORD p_dwUser, DWORD p_dw1, DWORD p_dw2);

	HMIDISTRM m_midiStreamH;     // 0x30
	MxBool m_midiInitialized;    // 0x34
	MxU32 m_bufferSize;          // 0x38
	MxU32 m_bufferCurrentSize;   // 0x3c
	MxU8* m_bufferOffset;        // 0x40
	MxU8* m_bufferCurrentOffset; // 0x44
	MxU32 m_loopCount;           // 0x48
	MIDIHDR* m_midiHdrP;         // 0x4c
	MxS32 m_multiplier;          // 0x50
	DWORD m_midiVolume;          // 0x54

	// SYNTHETIC: LEGO1 0x100c0610
	// MxMusicManager::`scalar deleting destructor'

protected:
	void Init();
	void InitData();
};

#endif // MXMUSICMANAGER_H
