#include <windows.h>
#include <stdio.h>
#include "kb2sf_config.h"
#include "kb2sf_decoder.h"
/////////////////////////////////////////////////////////////////////////////
static const wchar_t SEC_GENERAL[] = L"General";
static const wchar_t KEY_Interpolation[] = L"Interpolation";
static const wchar_t KEY_IgnoreVolumeTag[] = L"IgnoreVolumeTag";
static const wchar_t KEY_Volume[] = L"Volume";

static const DWORD Interpolation_default = 2;
static const wchar_t szInterpolation_default[] = L"2";
static const BOOL IgnoreVolumeTag_default = FALSE;
static const wchar_t szIgnoreVolumeTag_default[] = L"0";
static const double Volume_default = 100.0;
static const wchar_t szVolume_default[] = L"100.0";

/////////////////////////////////////////////////////////////////////////////
BOOL __fastcall kb2sf_EnumConfig(IKpiConfigEnumerator *pEnumerator)
{
    static const KPI_CFG_SECTION sec[] = {
        {SEC_GENERAL, NULL, L"kb2sf.kpi に関する一般的な設定です。"},
        {NULL, NULL, NULL}
    };
    static const KPI_CFG_KEY key[] = {
    //   type, section, key, keydesc, default, min, max, list, listdesc, help
        {KPI_CFG_TYPE_INT, SEC_GENERAL, KEY_Interpolation, NULL,
            szInterpolation_default, NULL, NULL, //default/min/max
            L"0\t1\t2", //list
            L"No interpolation\tLinear interpolation\tCosine interpolation", //listdesc
            L"0 : No interpolation\r\n"
            L"1 : Linear interpolation\r\n"
            L"2 : Cosine interpolation\r\n"
            L"\r\n"
            L"音質は良い順に 2 > 1 > 0 です。\r\n"
            L""
            },//help
        {KPI_CFG_TYPE_BOOL, SEC_GENERAL, KEY_IgnoreVolumeTag, NULL,
            szIgnoreVolumeTag_default, NULL, NULL, //default/min/max
            NULL, //list
            NULL, //listdesc
            L"true にすると volume タグを無視します。\r\n"
            L"true にすると「音量(%)」の設定だけが適用されます。\r\n"
            L"false にすると volume タグと「音量(%)」の設定が重ねて適用されます。\r\n"
            L"リプレイゲインとは区別されます。\r\n"
            L"リプレイゲインは本体によって処理されます。\r\n"
            L""
            },//help
        {KPI_CFG_TYPE_FLOAT, SEC_GENERAL, KEY_Volume, L"音量(%)",
            szVolume_default, L"10.0", L"500.0", //default/min/max
            L"200\t150\t125\t100\t90\t80\t70\t60\t50\t40\t30\t20\t10", //list
            L"200%\t150%\t125%\t100%\t90%\t80%\t70%\t60%\t50%\t40%\t30%\t20%\t10%", //listdesc
            L"音量(%)を指定します。\r\n"
            L"連続再生時に他のファイル形式と比べて大きいと感じる場合は 100 より小さく、\r\n"
            L"音量が小さいと感じる場合は 100 より大きくして下さい。\r\n"
            L"100 より大きくすると音割れする可能性があります。\r\n"
            L"PSF タグに volume タグを含む場合、重ねて適用されます。\r\n"
            L"リプレイゲインは本体によって処理されます。\r\n"
            L"(この設定と重ねて適用されます。)\r\n"
            L""
            },//help
        {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
    };
    for(int i = 0; sec[i].cszSection; i++){
        pEnumerator->EnumSection(&sec[i]);
    }
    for(int i = 0; key[i].cszSection; i++){
        pEnumerator->EnumKey(&key[i]);
    }
    return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
DWORD __fastcall kb2sf_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_KPI;
}
/////////////////////////////////////////////////////////////////////////////
void __fastcall kb2sf_GetSettings(IKpiConfig *pConfig, kb2sf_Settings *pSettings)
{
    pSettings->nInterpolation = 
        pConfig->GetInt(SEC_GENERAL, KEY_Interpolation, Interpolation_default);
    pSettings->bIgnoreVolumeTag =
        pConfig->GetInt(SEC_GENERAL, KEY_IgnoreVolumeTag, IgnoreVolumeTag_default) != 0;
    pSettings->dVolume =
        pConfig->GetFloat(SEC_GENERAL, KEY_Volume, Volume_default) / 100.0;
    if (pSettings->dVolume < 0.1) {
        pSettings->dVolume = 0.1;
    }
    else if (pSettings->dVolume > 5.0) {
        pSettings->dVolume = 5.0;
    }
}
/////////////////////////////////////////////////////////////////////////////
