#include <windows.h>
#include <stdio.h>
#include "kpi.h"
#include "kbdsound_config.h"
#include "kbdsound_enum.h"

static const wchar_t KEY_USE_DS_NOTIFY[] = L"UseDsNotify";
///////////////////////////////////////////////////////////////////////////////
//KbDSoundConfig
///////////////////////////////////////////////////////////////////////////////
void __fastcall KbDSoundConfig::GetSectionName(wchar_t *pszSectionName, int nSize,
                                               const wchar_t *cszDeviceName, 
                                               const wchar_t *cszId)
{
    wcsncpy_s(pszSectionName, nSize, cszDeviceName, _TRUNCATE);
    wcsncat_s(pszSectionName, nSize, L"-", _TRUNCATE);
    wcsncat_s(pszSectionName, nSize, cszId, _TRUNCATE);
}
///////////////////////////////////////////////////////////////////////////////
KbDSoundConfig::KbDSoundConfig(IKpiConfig *pConfig, 
                           const wchar_t *cszDeviceName, 
                           const wchar_t *cszId)
{
    m_pConfig = pConfig;
    GetSectionName(m_szSectionName, _countof(m_szSectionName), 
                   cszDeviceName, cszId);
    pConfig->AddRef();
}
///////////////////////////////////////////////////////////////////////////////
KbDSoundConfig::~KbDSoundConfig(void)
{
    m_pConfig->Release();
}
///////////////////////////////////////////////////////////////////////////////
bool __fastcall KbDSoundConfig::GetUseDsNotify(void)
{
    return m_pConfig->GetInt(m_szSectionName, KEY_USE_DS_NOTIFY, 1) != 0;
}
///////////////////////////////////////////////////////////////////////////////
BOOL __fastcall kbdsound_EnumConfig(IKpiConfigEnumerator *pEnumerator)
{
    KPI_CFG_KEY key[] =
    {
//   type, section, key, keydesc, default, min, max, list, listdesc, help
    {KPI_CFG_TYPE_BOOL, L"", KEY_USE_DS_NOTIFY, L"DirectSoundNotify を使う",
        L"1", NULL, NULL, //default/min/max
        NULL, NULL,       //list/listdesc
        L"DirectSoundNotify を使用すると正しく再生出来ない場合は \"false\" にしてみて下さい。問題なく再生出来るなら \"true\" の方が低負荷で効率的です。"},
    {(DWORD)-1, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}

    };
    KbDSoundEnumerator Enumerator;
    Enumerator.EnumerateDevices(NULL);
    int i, j;
    wchar_t szDeviceName[256];
    wchar_t szId[128];
    wchar_t szSection[_countof(szDeviceName) + _countof(szId)];
    for(i = 0; ;i++){
        Enumerator.GetDeviceName(i, szDeviceName, _countof(szDeviceName),
                                    szId, _countof(szId));
        if(!szDeviceName[0]){
            break;
        }
        KbDSoundConfig::GetSectionName(szSection, _countof(szSection),
                                     szDeviceName, szId);
        for(j = 0; key[j].cszSection; j++){
            key[j].cszSection = szSection;
            pEnumerator->EnumKey(&key[j]);
        }
    }
    return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
DWORD __fastcall kbdsound_ApplyConfig(IKpiConfig *pConfig,
                               const wchar_t *cszSection,//セクション名
                               const wchar_t *cszKey,    //キー名
                               INT64  nValue, //変更後の値(BOOL/INT の場合)
                               double dValue, //変更後の値(FLOAT の場合)
                               const wchar_t *cszValue)//変更後の値(文字列)
{
    pConfig->SetStr(cszSection, cszKey, cszValue);
    return KPI_CFGRET_RELOAD_DATA;
}
///////////////////////////////////////////////////////////////////////////////
