#pragma once

#include "kpi_player.h"
#include "kpi_impl.h"
#include "FMP7_SDK/fmp32_api.h"
#include "FMP7_SDK/fmp32_sharework.h"

///////////////////////////////////////////////////////////////////////////////
class KbFmp7Player : public KbKpiUnknownImpl<IKpiPlayer>
{
private:
    static const wchar_t *s_kbfmp7_filemap_name;
    struct FILEMAP_DATA{
        DWORD dwInstanceCount;//KbFmp7Player のインスタンスの数
        DWORD dwReopenTime;   //再生中に別のインスタンスから曲データを開いたときのその時刻
        DWORD dwCountNow;     //↑のときの再生位置
        DWORD dwTerminating;//FMP7 を終了中(FindWindow には成功してしまうので)
    };
    static HANDLE s_hFileMap;
    static FILEMAP_DATA *s_pFileMapData;

    KPI_MEDIAINFO m_MediaInfo;
    const wchar_t* m_cszFileName;//曲データのファイル名(m_pFile を Release するまで有効)
    IKpiFile      *m_pFile;
    IKpiFolder    *m_pFolder;
    IKpiConfig    *m_pConfig;
    IKpiFile     **m_ppPwiFiles;
    int            m_nPwiFiles;
    DWORD          m_dwTime;
    bool           m_bRepeat;
    bool           m_bFading;
    FMP32::FUNC   *m_pFunc;
    FMP32_GLOBALWORK *m_pWork;
    int         m_nGlobalWorkSize;
    HANDLE      m_hFileMap;
    HANDLE      m_hMutex;

    bool __fastcall ExecFmp7(void);
    FMP32_GLOBALWORK* __fastcall GetWork(void);
    void __fastcall ReleaseWork(void);
    void __fastcall GetTagInfo(IKpiTagInfo *pTagInfo);
    void __fastcall GetPwiFiles(void);
    static void __fastcall TerminateFMP7(void);
public:
    KbFmp7Player(IKpiConfig* pConfig);
    virtual ~KbFmp7Player(void);
    DWORD Open(const KPI_MEDIAINFO* cpRequest, IKpiFile* pFile, IKpiFolder* pFolder);
    //IKpiPlayer 派生
    DWORD WINAPI Select(DWORD dwNumber, const KPI_MEDIAINFO** ppInfo, IKpiTagInfo* pTagInfo, DWORD dwTagGetFlags);
    BOOL  WINAPI Play(DWORD dwStartpos, BOOL bVisible);
    BOOL  WINAPI Pause(void);
    BOOL  WINAPI Restart(void);
    void  WINAPI Stop(void);
    DWORD WINAPI GetPosition(void);
    DWORD WINAPI GetStatus(void);
    void  WINAPI SetTempo(int Tempo);
    void  WINAPI SetVolume(int Volume);
    void  WINAPI SetVisible(BOOL bVisible) { };
    void  WINAPI GetWindowPosition(int* pLeft, int* pTop, int* pVideoWidth, int* pVideoHeight) {
        *pLeft = *pTop = *pVideoWidth = *pVideoHeight = 0;
    };
    void  WINAPI SetWindowPosition(int nLeft, int nTop, int nVideoWidth, int nVideoHeight) { };
    void  WINAPI SetTopMost(BOOL bTopMost) { };
    void  WINAPI SetRepeat(BOOL bRepeat);
    DWORD WINAPI UpdateConfig(void* pvReserved);// { return 0; }   //設定が変更されたら呼ばれる
    //
    static void Initialize(void); //必要になったときに呼べば良い(KbFmp7Player 内で自動的に呼ぶ)
    static void Uinitialize(IKpiConfig* pConfig);//プラグインアンロード前に呼び出す
};
///////////////////////////////////////////////////////////////////////////////
