#pragma once

#include <windows.h>
#include <amstream.h>
#include "kpi_decoder.h"
#include "kpi_impl.h"

class KbDShowDecoder :  public KbKpiUnknownImpl<IKpiDecoder>
{
private:
    IAMMultiMediaStream *m_pAMMultiMediaStream;//deprecated だが代わりにどうすれば？
    IAudioStreamSample  *m_pAudioStreamSample; //同上
    IAudioData          *m_pAudioData;         //同上
    IKpiFile            *m_pFile;
    wchar_t              m_szFileName[MAX_PATH];//本当は実ファイルではなく m_pFile で開きたい
    KPI_MEDIAINFO        m_MediaInfo; 
    DWORD                m_dwBlockAlign;
    STREAM_STATE         m_State;
    static DWORD WINAPI ThreadProc(void *pvParam);// IAMMultiMediaStream を生成するスレッドと破棄するスレッドが異なるとフリーズするのを回避
    void  __fastcall ThreadProc(void);
    void  __fastcall Close(void);
public:
    BOOL __fastcall Open(const KPI_MEDIAINFO *cpRequest,
                         IKpiConfig *pConfig, 
                         IKpiFile *pFile, 
                         IKpiFolder *pFolder);
    DWORD  WINAPI Select(DWORD dwNumber,
                         const KPI_MEDIAINFO **ppMediaInfo,
                         IKpiTagInfo *pTagInfo,
                         DWORD dwTagGetFlags);
    DWORD  WINAPI Render(BYTE *pBuffer, DWORD dwSizeSample);
    UINT64 WINAPI Seek(UINT64 qwPosSample, DWORD dwFlag);
    DWORD  WINAPI UpdateConfig(void *pvReserved){return 0;}
    KbDShowDecoder(void);
    ~KbDShowDecoder(void);
};
