winamp/Src/Plugins/Encoder/enc_fhgaac/config.cpp
2024-09-24 14:54:57 +02:00

258 lines
6.6 KiB
C++

#include "config.h"
#include <windows.h>
#include <strsafe.h>
#include <assert.h>
#include "mp4FastAAClib.h"
#include "preferences.h"
AACConfigurationFile *AACConfig_Create(unsigned int type, const char *filename)
{
AACConfigurationFile *cfg = (AACConfigurationFile*)calloc(1, sizeof(AACConfigurationFile));
if (cfg)
{
cfg->type = type;
if (filename)
lstrcpynA(cfg->config_file, filename, MAX_PATH);
else
cfg->config_file[0] = 0;
AACConfig_Load(cfg);
}
return cfg;
}
void AACConfig_Load(AACConfigurationFile *cfg)
{
if (cfg->type == ENCODER_TYPE_MPEG4)
{
cfg->config.mode = GetPrivateProfileIntA("audio_fhgaac", "mode", AAC_DEFAULT_MODE, cfg->config_file);
cfg->config.profile = GetPrivateProfileIntA("audio_fhgaac", "profile", AAC_DEFAULT_PROFILE, cfg->config_file);
cfg->config.bitrate = GetPrivateProfileIntA("audio_fhgaac", "bitrate", AAC_DEFAULT_BITRATE, cfg->config_file);
cfg->config.preset = GetPrivateProfileIntA("audio_fhgaac", "preset", AAC_DEFAULT_PRESET, cfg->config_file);
cfg->config.surround = GetPrivateProfileIntA("audio_fhgaac", "surround", AAC_DEFAULT_SURROUND, cfg->config_file);
cfg->shoutcast = 0;
}
else
{
cfg->config.mode = AAC_MODE_CBR;
cfg->config.profile = GetPrivateProfileIntA("audio_adtsaac", "profile", AAC_PROFILE_HE, cfg->config_file);
cfg->config.bitrate = GetPrivateProfileIntA("audio_adtsaac", "bitrate", 64, cfg->config_file);
cfg->config.surround = GetPrivateProfileIntA("audio_adtsaac", "surround", AAC_DEFAULT_SURROUND, cfg->config_file);
cfg->shoutcast = GetPrivateProfileIntA("audio_adtsaac", "shoutcast", 0, cfg->config_file);
}
}
void AACConfig_Save(const AACConfigurationFile *cfg)
{
char temp[128] = {0};
if (cfg->type == ENCODER_TYPE_MPEG4)
{
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.mode);
WritePrivateProfileStringA("audio_fhgaac", "mode", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.profile);
WritePrivateProfileStringA("audio_fhgaac", "profile", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.bitrate);
WritePrivateProfileStringA("audio_fhgaac", "bitrate", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.preset);
WritePrivateProfileStringA("audio_fhgaac", "preset", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.surround);
WritePrivateProfileStringA("audio_fhgaac", "surround", temp, cfg->config_file);
}
else
{
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.profile);
WritePrivateProfileStringA("audio_adtsaac", "profile", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.bitrate);
WritePrivateProfileStringA("audio_adtsaac", "bitrate", temp, cfg->config_file);
StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.surround);
WritePrivateProfileStringA("audio_adtsaac", "surround", temp, cfg->config_file);
}
}
void AACConfig_GetBitrateRange(const AACConfiguration *cfg, int *low, int *high)
{
switch(cfg->profile)
{
case AAC_PROFILE_AUTOMATIC:
*low = 12000;
*high = 448000;
break;
case AAC_PROFILE_LC:
*low = 16000;
*high = 448000;
break;
case AAC_PROFILE_HE:
*low = 16000;
*high = 128000;
break;
case AAC_PROFILE_HE_V2:
*low = 12000;
*high = 56000;
break;
}
}
AUD_OBJ_TYP AACConfig_GetAOT(const AACConfiguration *cfg)
{
if (cfg->mode == AAC_MODE_VBR)
{
switch(cfg->preset)
{
case 1:
return AUD_OBJ_TYP_PS;
case 2:
return AUD_OBJ_TYP_HEAAC;
default:
return AUD_OBJ_TYP_LC;
}
}
else switch (cfg->profile) /* CBR */
{
case AAC_PROFILE_AUTOMATIC:
if (cfg->bitrate <= 40)
return AUD_OBJ_TYP_PS;
else if (cfg->bitrate <= 80)
return AUD_OBJ_TYP_HEAAC;
else
return AUD_OBJ_TYP_LC;
case AAC_PROFILE_LC:
return AUD_OBJ_TYP_LC;
case AAC_PROFILE_HE:
return AUD_OBJ_TYP_HEAAC;
case AAC_PROFILE_HE_V2:
return AUD_OBJ_TYP_PS;
}
return AUD_OBJ_TYP_LC;
}
int AACConfig_GetBitrate(const AACConfiguration *cfg, unsigned int channels)
{
if (cfg->mode == AAC_MODE_VBR)
{
switch(cfg->preset)
{
case 1:
return 16000*channels;
case 2:
return 32000*channels;
case 3:
return 48000*channels;
case 4:
return 64000*channels;
case 5:
return 96000*channels;
case 6:
return 128000*channels;
default:
return 0;
}
}
else
return cfg->bitrate * 1000;
}
MPEG4ENC_BITRATE_MODE AACConfig_GetBitrateMode(const AACConfiguration *cfg)
{
if (cfg->mode == AAC_MODE_VBR)
{
/* by coincidence, these match
to help future maintainers, let's assert this fact */
assert(MP4_BR_MODE_VBR_1 == (MPEG4ENC_BITRATE_MODE)1);
assert(MP4_BR_MODE_VBR_2 == (MPEG4ENC_BITRATE_MODE)2);
assert(MP4_BR_MODE_VBR_3 == (MPEG4ENC_BITRATE_MODE)3);
assert(MP4_BR_MODE_VBR_4 == (MPEG4ENC_BITRATE_MODE)4);
assert(MP4_BR_MODE_VBR_5 == (MPEG4ENC_BITRATE_MODE)5);
assert(MP4_BR_MODE_VBR_6 == (MPEG4ENC_BITRATE_MODE)6);
return (MPEG4ENC_BITRATE_MODE)cfg->preset;
}
else /* CBR */
{
return MP4_BR_MODE_CBR;
}
}
MPEG4ENC_CH_MODE AACConfig_GetChannelMode(const AACConfiguration *cfg, unsigned int channels)
{
switch(channels)
{
case 1:
return MP4_CH_MODE_MONO;
case 2:
if (cfg->mode == AAC_MODE_VBR)
{
if (cfg->preset == 1)
return MP4_CH_MODE_PARAMETRIC_STEREO;
else
return MP4_CH_MODE_STEREO;
}
else /* CBR */
{
if (AACConfig_GetAOT(cfg) == AUD_OBJ_TYP_PS)
return MP4_CH_MODE_PARAMETRIC_STEREO;
else
return MP4_CH_MODE_STEREO;
}
case 3: return MP4_CH_MODE_3;
case 4: return MP4_CH_MODE_4;
case 5: return MP4_CH_MODE_5;
case 6: return MP4_CH_MODE_5_1;
case 8: return MP4_CH_MODE_7_1;
default:
return MP4_CH_MODE_INVALID;
}
}
void AACConfig_GetToolString(const MPEG4ENC_SETUP *setup, char tool[], size_t cch)
{
char version[128] = {0};
MPEG4ENC_GetVersionInfo(version, sizeof(version)/sizeof(*version));
char *p = version;
while (p && *p)
{
if (*p != '.' && (*p < '0' || *p > '9'))
{
*p = 0;
break;
}
p++;
}
switch(setup->bitrateMode)
{
case MP4_BR_MODE_CBR:
StringCchPrintfA(tool, cch, "fhgaac v%s;CBR=%d", version, setup->nBitRate);
break;
case MP4_BR_MODE_VBR_1:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=1", version);
break;
case MP4_BR_MODE_VBR_2:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=2", version);
break;
case MP4_BR_MODE_VBR_3:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=3", version);
break;
case MP4_BR_MODE_VBR_4:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=4", version);
break;
case MP4_BR_MODE_VBR_5:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=5", version);
break;
case MP4_BR_MODE_VBR_6:
StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=6", version);
break;
}
}