diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Encoder | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Encoder')
94 files changed, 15316 insertions, 0 deletions
diff --git a/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.cpp b/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.cpp new file mode 100644 index 00000000..08ddb0a3 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.cpp @@ -0,0 +1,119 @@ +#include "ADTSAACEncoder.h" +#include "mp4FastAAClib.h" +#include <malloc.h> +#include "config.h" +#include "../nsutil/pcm.h" + +ADTSAACEncoder *ADTSAACEncoder::CreateDecoder(const AACConfiguration *cfg, int nch, int srate, int bps) +{ + MPEG4ENC_ERROR err; + + MPEG4ENC_SETUP setup; + setup.aot = AACConfig_GetAOT(cfg); + setup.nBitRate = AACConfig_GetBitrate(cfg, nch); + setup.bitrateMode = AACConfig_GetBitrateMode(cfg); + setup.quality = MP4_QUAL_HIGH; + setup.chMode = AACConfig_GetChannelMode(cfg, nch); + setup.sbrSignaling = MP4_SBRSIG_IMPLICIT; + setup.nSampleRateIn = srate; + setup.transportFormat = MP4_TT_ADTS; + setup.nGranuleLength = MP4_GRANULE_1024; + setup.metadataMode = MP4_METADATA_NONE; + + HANDLE_MPEG4ENC_ENCODER encoder=0; + err = MPEG4ENC_Configure(&encoder, &setup); + if (err != MPEG4ENC_NO_ERROR) + { + return 0; + } + + unsigned int first_samples; + err = MPEG4ENC_Open(&encoder, &first_samples); + if (err != MPEG4ENC_NO_ERROR) + { + + MPEG4ENC_Close(&encoder); + return 0; + } + float *sample_buffer = (float *)malloc(first_samples * sizeof(float)); + if (!sample_buffer) + { + MPEG4ENC_Close(&encoder); + return 0; + } + + ADTSAACEncoder *fhg_enc = new ADTSAACEncoder(encoder, &setup, nch, srate, bps, sample_buffer, first_samples); + if (!fhg_enc) + { + free(sample_buffer); + MPEG4ENC_Close(&encoder); + } + + AACConfig_GetToolString(&setup, fhg_enc->tool, sizeof(fhg_enc->tool)); + + return fhg_enc; +} + +ADTSAACEncoder::ADTSAACEncoder(HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup, int nch, int srate, int bps, float *sample_buffer, unsigned int next_samples) +: encoder(encoder), channels(nch), sample_rate(srate), bits_per_sample(bps), sample_buffer(sample_buffer), next_samples(next_samples) +{ + MPEG4ENC_INFO info; + MPEG4ENC_GetInfo(encoder, &info); + samples_per_frame = info.nSamplesFrame[0]; + + finishing=false; +} + +ADTSAACEncoder::~ADTSAACEncoder() +{ + free(sample_buffer); + MPEG4ENC_Close(&encoder); +} + +int ADTSAACEncoder::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (!in_avail && !finishing) + return 0; + + size_t num_samples = in_avail / (bits_per_sample/8); + num_samples = min(num_samples, next_samples); + + nsutil_pcm_IntToFloat_Interleaved(sample_buffer, in, bits_per_sample, num_samples); + + int samples_consumed=0; + int out_used = 0; + MPEG4ENC_AUINFO *info; + MPEG4ENC_ERROR err = MPEG4ENC_Encode(encoder, sample_buffer, num_samples, &samples_consumed, &next_samples, (unsigned char * const)out, out_avail, &out_used, &info); + if (err != MPEG4ENC_NO_ERROR) + { + out_used = 0; /* in case it didn't get set */ + } + else if (err != MPEG4ENC_NO_ERROR) + { + return 0; + } + if (!finishing) + { + *in_used = samples_consumed * (bits_per_sample/8); + } + + return out_used; +} + +void ADTSAACEncoder::PrepareToFinish() +{ + finishing=true; +} + +void ADTSAACEncoder::Finish(const wchar_t *filename) +{ + /* TODO: + MPEG4ENC_INFO info; + MPEG4ENC_GetInfo(encoder, &info); + if (!resampling) + mp4_writer.WriteGaps(info.nDelay, decodable_samples-total_samples-info.nDelay, total_samples); + + mp4_writer.WriteTool(tool); + */ + +} diff --git a/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.h b/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.h new file mode 100644 index 00000000..b96bd863 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/ADTSAACEncoder.h @@ -0,0 +1,25 @@ +#pragma once +#include "mp4FastAAClib.h" +#include "config.h" +#include "encoder_common.h" + + +class ADTSAACEncoder : public EncoderCommon +{ +public: + static ADTSAACEncoder *CreateDecoder(const AACConfiguration *cfg, int nch, int srate, int bps); + ADTSAACEncoder(HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup, int nch, int srate, int bps, float *sample_buffer, unsigned int next_samples); + ~ADTSAACEncoder(); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); + void PrepareToFinish(); + void Finish(const wchar_t *filename); +private: + HANDLE_MPEG4ENC_ENCODER encoder; + unsigned int channels; + unsigned int sample_rate; + unsigned int bits_per_sample; + unsigned int next_samples; + unsigned int samples_per_frame; + float *sample_buffer; + bool finishing; +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.cpp b/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.cpp new file mode 100644 index 00000000..6d2b31b3 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.cpp @@ -0,0 +1,128 @@ +#include "FhGAACEncoder.h" +#include "mp4FastAAClib.h" +#include <malloc.h> +#include "config.h" +#include "../nsutil/pcm.h" + +FhGAACEncoder *FhGAACEncoder::CreateDecoder(const AACConfiguration *cfg, int nch, int srate, int bps) +{ + MPEG4ENC_ERROR err; + + MPEG4ENC_SETUP setup; + setup.aot = AACConfig_GetAOT(cfg); + setup.nBitRate = AACConfig_GetBitrate(cfg, nch); + setup.bitrateMode = AACConfig_GetBitrateMode(cfg); + setup.quality = MP4_QUAL_HIGH; + setup.chMode = AACConfig_GetChannelMode(cfg, nch); + setup.sbrSignaling = MP4_SBRSIG_EXPL_BC; + setup.nSampleRateIn = srate; + setup.transportFormat = MP4_TT_RAW; + setup.nGranuleLength = MP4_GRANULE_1024; + setup.metadataMode = MP4_METADATA_NONE; + + HANDLE_MPEG4ENC_ENCODER encoder=0; + err = MPEG4ENC_Configure(&encoder, &setup); + if (err != MPEG4ENC_NO_ERROR) + { + return 0; + } + + unsigned int first_samples; + err = MPEG4ENC_Open(&encoder, &first_samples); + if (err != MPEG4ENC_NO_ERROR) + { + + MPEG4ENC_Close(&encoder); + return 0; + } + float *sample_buffer = (float *)malloc(first_samples * sizeof(float)); + if (!sample_buffer) + { + MPEG4ENC_Close(&encoder); + return 0; + } + + FhGAACEncoder *fhg_enc = new FhGAACEncoder(encoder, &setup, nch, srate, bps, sample_buffer, first_samples); + if (!fhg_enc) + { + free(sample_buffer); + MPEG4ENC_Close(&encoder); + } + + AACConfig_GetToolString(&setup, fhg_enc->tool, sizeof(fhg_enc->tool)); + return fhg_enc; +} + +FhGAACEncoder::FhGAACEncoder(HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup, int nch, int srate, int bps, float *sample_buffer, unsigned int next_samples) +: encoder(encoder), channels(nch), sample_rate(srate), bits_per_sample(bps), sample_buffer(sample_buffer), next_samples(next_samples) +{ + MPEG4ENC_INFO info; + MPEG4ENC_GetInfo(encoder, &info); + samples_per_frame = info.nSamplesFrame[0]; + + if (info.nSamplingRate[0] != srate) + resampling = true; + else + resampling = false; + finishing=false; + total_samples=0; + decodable_samples=0; + // TODO: move this somewhere where we can error-check + mp4_writer.AddAudioTrack(encoder, setup); +} + +FhGAACEncoder::~FhGAACEncoder() +{ + free(sample_buffer); + MPEG4ENC_Close(&encoder); +} + +int FhGAACEncoder::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (!in_avail && !finishing) + return 0; + + size_t num_samples = in_avail / (bits_per_sample/8); + num_samples = min(num_samples, next_samples); + + nsutil_pcm_IntToFloat_Interleaved(sample_buffer, in, bits_per_sample, num_samples); + + int samples_consumed=0; + int out_used = 0; + MPEG4ENC_AUINFO *info; + MPEG4ENC_ERROR err = MPEG4ENC_Encode(encoder, sample_buffer, num_samples, &samples_consumed, &next_samples, (unsigned char * const)out, out_avail, &out_used, &info); + if (err == MPEG4ENC_NO_ERROR && out_used) + { + decodable_samples += samples_per_frame; + mp4_writer.Write(out, out_used, samples_per_frame); + } + else if (err != MPEG4ENC_NO_ERROR) + { + return 0; + } + + if (!finishing) + { + *in_used = samples_consumed * (bits_per_sample/8); + total_samples += samples_consumed / channels; + } + + return out_used; +} + +void FhGAACEncoder::PrepareToFinish() +{ + finishing=true; +} + +void FhGAACEncoder::Finish(const wchar_t *filename) +{ + MPEG4ENC_INFO info; + MPEG4ENC_GetInfo(encoder, &info); + if (!resampling) + mp4_writer.WriteGaps(info.nDelay, decodable_samples-total_samples-info.nDelay, total_samples); + + mp4_writer.WriteTool(tool); + + mp4_writer.CloseTo(filename); +} diff --git a/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.h b/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.h new file mode 100644 index 00000000..6bd8fec7 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/FhGAACEncoder.h @@ -0,0 +1,29 @@ +#pragma once +#include "MP4Writer.h" +#include "mp4FastAAClib.h" +#include "config.h" +#include "encoder_common.h" + +class FhGAACEncoder : public EncoderCommon +{ +public: + static FhGAACEncoder *CreateDecoder(const AACConfiguration *cfg, int nch, int srate, int bps); + FhGAACEncoder(HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup, int nch, int srate, int bps, float *sample_buffer, unsigned int next_samples); + ~FhGAACEncoder(); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); + void PrepareToFinish(); + void Finish(const wchar_t *filename); +private: + HANDLE_MPEG4ENC_ENCODER encoder; + unsigned int channels; + unsigned int sample_rate; + unsigned int bits_per_sample; + unsigned int next_samples; + unsigned int samples_per_frame; + float *sample_buffer; + MP4Writer mp4_writer; + uint64_t total_samples; + uint64_t decodable_samples; + bool finishing; + bool resampling; +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp new file mode 100644 index 00000000..00f6d811 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp @@ -0,0 +1,64 @@ +#include "MP4Writer.h" + +#include <strsafe.h> + +MP4Writer::MP4Writer() +{ + wchar_t tmppath[MAX_PATH-14] = {0}; + GetTempPathW(MAX_PATH-14,tmppath); + GetTempFileNameW(tmppath, L"mp4", 0, tempfile); + mp4File = MP4Create(tempfile); + if(!mp4File) + { + return; + } +} + +MP4Writer::~MP4Writer() +{ + /* in case it's lingering open */ + if (mp4File) + MP4Close(mp4File); +} + +void MP4Writer::CloseTo(const wchar_t *filename) +{ + MP4Close(mp4File); + mp4File=0; + MP4MakeIsmaCompliant(tempfile, 0, true); + DeleteFileW(filename); + if (MoveFileW(tempfile,filename) == 0) // if the function fails + { + CopyFileW(tempfile,filename, FALSE); + DeleteFileW(tempfile); + } +} + +void MP4Writer::WriteGaps(uint32_t pregap, uint32_t postgap, uint64_t totalSamples) +{ + char data[128] = {0}; + StringCchPrintfA(data, 128, " %08X %08X %08X %016X %08X %08X %08X %08X %08X %08X %08X %08X", 0, pregap, postgap, totalSamples, 0, 0,0, 0,0, 0,0, 0); + MP4SetMetadataFreeForm(mp4File, "iTunSMPB", (u_int8_t *)data, lstrlenA(data)); +} + +void MP4Writer::Write(const void *buf, size_t size, MP4Duration duration) +{ + MP4WriteSample(mp4File, mp4Track, (const uint8_t *)buf, size, duration); +} + +void MP4Writer::AddAudioTrack(const HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup) +{ + MPEG4ENC_INFO info; + MPEG4ENC_GetInfo(encoder, &info); + + MP4SetTimeScale(mp4File, info.nSamplingRate[0]); + + mp4Track = MP4AddAudioTrack(mp4File, info.nSamplingRate[0], info.nSamplesFrame[0], MP4_MPEG4_AUDIO_TYPE); + MP4SetAudioProfileLevel(mp4File, info.nProfLev); + MP4SetTrackESConfiguration(mp4File, mp4Track, info.ascBuf[0].ascBuffer, (info.ascBuf[0].nAscSizeBits+7)/8); +} + +void MP4Writer::WriteTool(const char *tool) +{ + MP4SetMetadataTool(mp4File, tool); +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.h b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.h new file mode 100644 index 00000000..5ae6ea06 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.h @@ -0,0 +1,25 @@ +#pragma once + +#include <mp4.h> +#include "mp4FastAAClib.h" +#include "config.h" + +class MP4Writer +{ +public: + MP4Writer(); + ~MP4Writer(); + + void AddAudioTrack(const HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup); + void WriteGaps(uint32_t pregap, uint32_t postgap, uint64_t totalSamples); + void WriteTool(const char *tool); + void Write(const void *buf, size_t size, MP4Duration duration); + void CloseTo(const wchar_t *filename); + + bool OK() { return true; } + + MP4TrackId mp4Track; + MP4FileHandle mp4File; + wchar_t tempfile[MAX_PATH]; +}; + diff --git a/Src/Plugins/Encoder/enc_fhgaac/config.cpp b/Src/Plugins/Encoder/enc_fhgaac/config.cpp new file mode 100644 index 00000000..e899b052 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/config.cpp @@ -0,0 +1,258 @@ +#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; + } +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/config.h b/Src/Plugins/Encoder/enc_fhgaac/config.h new file mode 100644 index 00000000..5a7dc009 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/config.h @@ -0,0 +1,64 @@ +#pragma once + +#include "mp4FastAAClib.h" +#include <windows.h> // or MAX_PATH + + +#define ENCODER_TYPE_MPEG4 (mmioFOURCC('A','A','C','f')) +#define ENCODER_TYPE_ADTS (mmioFOURCC('A','D','T','S')) + +enum +{ + AAC_MODE_VBR=0, + AAC_MODE_CBR=1, + + /* these are the profile options when CBR is selected */ + AAC_PROFILE_AUTOMATIC=0, + AAC_PROFILE_LC=1, + AAC_PROFILE_HE=2, + AAC_PROFILE_HE_V2=3, + + /* Surround options */ + AAC_SURROUND_BCC = 0, /* Binaural Cue Coding, stereo + surround layer, aka MPEG-Surround */ + AAC_SURROUND_DISCRETE = 1, /* Discrete surround (traditional AAC surround sound with separate SCE per channel pair) */ + + /* defaults */ + AAC_DEFAULT_MODE = AAC_MODE_VBR, + AAC_DEFAULT_PROFILE = AAC_PROFILE_AUTOMATIC, + AAC_DEFAULT_BITRATE = 128, + AAC_DEFAULT_PRESET = 4, + AAC_DEFAULT_SURROUND = AAC_SURROUND_BCC, +}; + +struct AACConfiguration +{ + unsigned int mode; /* CBR or VBR */ + unsigned int profile; /* what flavor of AAC, e.g. LC, or automatic */ + unsigned int bitrate; /* bitrate for CBR */ + unsigned int preset; /* preset for VBR */ + unsigned int surround; /* 0 = discrete, 1 = MPEG Surround */ +}; + +struct AACConfigurationFile +{ + AACConfiguration config; + unsigned int channels; + unsigned int sample_rate; + unsigned int type; /* either ENCODER_TYPE_MPEG4 or ENCODER_TYPE_ADTS */ + unsigned int shoutcast; /* 0 by default, 1 if we're being invoked from dsp_sc */ + bool changing; /* used internally by preferences */ + char config_file[MAX_PATH]; +}; + +AACConfigurationFile *AACConfig_Create(unsigned int type, const char *filename); /* de-allocate with free() */ +void AACConfig_Load(AACConfigurationFile *cfg); +void AACConfig_Save(const AACConfigurationFile *cfg); +/* bitrates are in bits/sec (not kbps), divide by 1000 if you need to +TODO: ASSUMES 44.1kHz Stereo. We need to make the encoder API accept samplerate/channels input better! +*/ +void AACConfig_GetBitrateRange(const AACConfiguration *cfg, int *low, int *high); +AUD_OBJ_TYP AACConfig_GetAOT(const AACConfiguration *cfg); +int AACConfig_GetBitrate(const AACConfiguration *cfg, unsigned int channels); +MPEG4ENC_BITRATE_MODE AACConfig_GetBitrateMode(const AACConfiguration *cfg); +MPEG4ENC_CH_MODE AACConfig_GetChannelMode(const AACConfiguration *cfg, unsigned int channels); +void AACConfig_GetToolString(const MPEG4ENC_SETUP *setup, char tool[], size_t cch);
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.rc b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.rc new file mode 100644 index 00000000..f1911026 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.rc @@ -0,0 +1,150 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PREFERENCES_MP4 DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "MPEG-4 AAC Encoder Options",IDC_STATIC,0,0,255,130 + LTEXT "Mode:",IDC_STATIC,57,14,27,12,SS_CENTERIMAGE + COMBOBOX IDC_MODE,87,14,110,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Profile:",IDC_STATIC_PROFILE,57,32,27,12,SS_CENTERIMAGE + COMBOBOX IDC_PROFILE,87,32,110,103,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Preset:",IDC_STATIC_PRESET,9,43,24,15,SS_CENTERIMAGE + CONTROL "",IDC_SLIDER_PRESET,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,28,57,170,15 + EDITTEXT IDC_EDIT_PRESET,203,58,25,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "kbps",IDC_KBPS,231,60,16,8,SS_CENTERIMAGE + LTEXT "Smallest Size",IDC_STATIC,16,76,42,8 + LTEXT "Highest Quality",IDC_STATIC,168,76,50,8 + GROUPBOX "Output Information",IDC_STATIC,0,91,255,39 + LTEXT "",IDC_INFO_MODE,12,103,208,8 + LTEXT "",IDC_INFO_BITRATE,12,113,185,8 + CONTROL "Help",IDC_HELPLINK,"Button",BS_OWNERDRAW | WS_TABSTOP,223,108,19,10 + LTEXT "HE-AAC encoding licensed by ",IDC_STATIC,12,135,115,8,SS_CENTERIMAGE + CONTROL "Fraunhofer IIS",IDC_URL,"Button",BS_OWNERDRAW | WS_TABSTOP,12,146,50,8 + CONTROL 104,IDC_LOGO,"Static",SS_BITMAP | SS_NOTIFY,161,134,75,25 + LTEXT "",IDC_VERSION,12,157,115,8 +END + +IDD_PREFERENCES_ADTS DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "ADTS-AAC Encoder Options",IDC_STATIC,0,0,255,130 + LTEXT "Files created with this encoder will not play on most devices, including the iPod and Android! Use the MPEG-4 AAC encoder instead, unless your device specifically requires ADTS files.",IDC_WARNING,9,10,232,24 + LTEXT "Profile:",IDC_STATIC_PROFILE,57,37,27,12,SS_CENTERIMAGE + COMBOBOX IDC_PROFILE,87,37,110,103,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Preset:",IDC_STATIC_PRESET,9,43,24,15,SS_CENTERIMAGE + CONTROL "",IDC_SLIDER_PRESET,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,28,57,170,15 + EDITTEXT IDC_EDIT_PRESET,203,58,25,12,ES_AUTOHSCROLL + LTEXT "kbps",IDC_KBPS,231,60,16,8,SS_CENTERIMAGE + LTEXT "Smallest Size",IDC_STATIC,16,76,42,8 + LTEXT "Highest Quality",IDC_STATIC,168,76,50,8 + GROUPBOX "Output Information",IDC_STATIC,0,91,255,39 + LTEXT "",IDC_INFO_MODE,12,103,208,8 + LTEXT "",IDC_INFO_BITRATE,12,113,185,8 + CONTROL "Help",IDC_HELPLINK,"Button",BS_OWNERDRAW | WS_TABSTOP,223,108,19,10 + LTEXT "HE-AAC encoding licensed by ",IDC_STATIC,12,135,115,8,SS_CENTERIMAGE + CONTROL "Fraunhofer IIS",IDC_URL,"Button",BS_OWNERDRAW | WS_TABSTOP,12,146,50,8 + CONTROL 104,IDC_LOGO,"Static",SS_BITMAP | SS_NOTIFY,161,134,75,25 + LTEXT "",IDC_VERSION,12,157,115,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_FHGLOGO BITMAP "fraunhofer_wa_prefs_noalpha.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + 65535 "{E1763EF4-08AD-44a3-914A-8302748AB975}" +END + +STRINGTABLE +BEGIN + IDS_ENC_FHGAAC_DESC "MPEG-4 AAC Encoder v%s" + IDS_VBR_PRESET "Variable Bitrate, Preset %u, typical bitrate: %u kbps" + IDS_CBR_PRESET "Constant Bitrate, target bitrate: %u kbps" + IDS_VBR "Variable Bitrate (VBR)" + IDS_CBR "Constant Bitrate (CBR)" + IDS_AUTOMATIC "Automatic" + IDS_BITRATE "Bitrate:" + IDS_PRESET "Preset:" + IDS_VERSION "Version %s" + IDC_ENC_ADTS_DESC "SHOUTcast MPEG-2 ADTS-AAC Encoder v%s" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.sln b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.sln new file mode 100644 index 00000000..7228e38b --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_fhgaac", "enc_fhgaac.vcproj", "{1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp4v2", "..\libmp4v2\libmp4v2.vcproj", "{EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}.Debug|Win32.Build.0 = Debug|Win32 + {1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}.Release|Win32.ActiveCfg = Release|Win32 + {1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}.Release|Win32.Build.0 = Release|Win32 + {EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}.Debug|Win32.ActiveCfg = Debug|Win32 + {EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}.Debug|Win32.Build.0 = Debug|Win32 + {EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}.Release|Win32.ActiveCfg = Release|Win32 + {EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.vcproj b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.vcproj new file mode 100644 index 00000000..cfb24d94 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/enc_fhgaac.vcproj @@ -0,0 +1,322 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="enc_fhgaac" + ProjectGUID="{1EB5ECD6-A4E1-4AEE-99D3-3280F60433F2}" + RootNamespace="enc_fhgaac" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../Wasabi;../libmp4v2" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;ENC_FHGAAC_EXPORTS;_WIN32_WINNT=0x500" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + TreatWChar_tAsBuiltInType="true" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="shlwapi.lib" + OutputFile="$(ProgramFiles)/Winamp/Plugins/enc_fhgaac.dll" + LinkIncremental="2" + IgnoreDefaultLibraryNames="" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)/enc_fhgaac.pdb" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + ImportLibrary="$(OutDir)/enc_fhgaac.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="1" + FavorSizeOrSpeed="2" + AdditionalIncludeDirectories="../Wasabi;../libmp4v2" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;ENC_FHGAAC_EXPORTS;_WIN32_WINNT=0x500" + StringPooling="true" + RuntimeLibrary="2" + BufferSecurityCheck="false" + TreatWChar_tAsBuiltInType="true" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + DisableSpecificWarnings="4244" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="shlwapi.lib msvcrt.lib" + OutputFile="$(ProgramFiles)/Winamp/Plugins/enc_fhgaac.dll" + LinkIncremental="1" + GenerateManifest="false" + IgnoreAllDefaultLibraries="true" + IgnoreDefaultLibraryNames="msvcprt.lib" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + RandomizedBaseAddress="1" + ImportLibrary="$(OutDir)/enc_fhgaac.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + <ProjectReference + ReferencedProjectIdentifier="{EFB9B882-6A8B-463D-A8E3-A2807AFC5D9F}" + RelativePathToProject="..\libmp4v2\libmp4v2.vcproj" + /> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\ADTSAACEncoder.cpp" + > + </File> + <File + RelativePath=".\ADTSAACEncoder.h" + > + </File> + <File + RelativePath="..\nu\AutoWideFn.h" + > + </File> + <File + RelativePath=".\config.cpp" + > + </File> + <File + RelativePath=".\encoder_common.h" + > + </File> + <File + RelativePath=".\FhGAACEncoder.cpp" + > + </File> + <File + RelativePath=".\FhGAACEncoder.h" + > + </File> + <File + RelativePath=".\libirc.lib" + > + </File> + <File + RelativePath=".\main.cpp" + > + </File> + <File + RelativePath=".\mp4FastAAClib.lib" + > + </File> + <File + RelativePath=".\MP4Writer.cpp" + > + </File> + <File + RelativePath=".\MP4Writer.h" + > + </File> + <File + RelativePath=".\preferences.cpp" + > + </File> + <File + RelativePath=".\preferences_adts.cpp" + > + </File> + <File + RelativePath=".\preferences_mp4.cpp" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\config.h" + > + </File> + <File + RelativePath=".\preferences.h" + > + </File> + <File + RelativePath=".\resource.h" + > + </File> + <File + RelativePath="..\nu\Slider.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + <File + RelativePath=".\enc_fhgaac.rc" + > + </File> + <File + RelativePath=".\fraunhofer_wa_prefs_noalpha.bmp" + > + </File> + </Filter> + <Filter + Name="UI Helpers" + > + <File + RelativePath="..\nu\ComboBox.h" + > + </File> + <File + RelativePath=".\link_control.cpp" + > + </File> + <File + RelativePath=".\link_control.h" + > + </File> + </Filter> + <File + RelativePath="..\nsutil\nsutil.lib" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/Src/Plugins/Encoder/enc_fhgaac/encoder_common.h b/Src/Plugins/Encoder/enc_fhgaac/encoder_common.h new file mode 100644 index 00000000..4b8882bd --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/encoder_common.h @@ -0,0 +1,9 @@ +#pragma once +#include "../nsv/enc_if.h" +class EncoderCommon : public AudioCoder +{ +public: + virtual void PrepareToFinish()=0; + virtual void Finish(const wchar_t *filename){} + char tool[256]; +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/fraunhofer_wa_prefs_noalpha.bmp b/Src/Plugins/Encoder/enc_fhgaac/fraunhofer_wa_prefs_noalpha.bmp Binary files differnew file mode 100644 index 00000000..f3edc518 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/fraunhofer_wa_prefs_noalpha.bmp diff --git a/Src/Plugins/Encoder/enc_fhgaac/libirc.lib b/Src/Plugins/Encoder/enc_fhgaac/libirc.lib Binary files differnew file mode 100644 index 00000000..c91176b7 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/libirc.lib diff --git a/Src/Plugins/Encoder/enc_fhgaac/link_control.cpp b/Src/Plugins/Encoder/enc_fhgaac/link_control.cpp new file mode 100644 index 00000000..5f34f40b --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/link_control.cpp @@ -0,0 +1,63 @@ +#include <windows.h> +#include "link_control.h" + +static HCURSOR link_hand_cursor; +static LRESULT link_handlecursor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LRESULT ret = CallWindowProcW((WNDPROC)GetPropW(hwndDlg, L"link_proc"), hwndDlg, uMsg, wParam, lParam); + // override the normal cursor behaviour so we have a hand to show it is a link + if(uMsg == WM_SETCURSOR) + { + if((HWND)wParam == hwndDlg) + { + if(!link_hand_cursor) + { + link_hand_cursor = LoadCursor(NULL, IDC_HAND); + } + SetCursor(link_hand_cursor); + return TRUE; + } + } + return ret; +} + +void link_startsubclass(HWND hwndDlg, UINT id){ +HWND ctrl = GetDlgItem(hwndDlg, id); + SetPropW(ctrl, L"link_proc", + (HANDLE)(LONG_PTR)SetWindowLongPtrW(ctrl, GWLP_WNDPROC, (LONG_PTR)link_handlecursor)); +} + +void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg == WM_DRAWITEM) + { + DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam; + if (di->CtlType == ODT_BUTTON) + { + wchar_t wt[123] = {0}; + int y; + RECT r; + HPEN hPen, hOldPen; + GetDlgItemTextW(hwndDlg, (INT)wParam, wt, 123); + + // draw text + SetTextColor(di->hDC, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + r = di->rcItem; + r.left += 2; + DrawTextW(di->hDC, wt, -1, &r, DT_VCENTER | DT_SINGLELINE); + + memset(&r, 0, sizeof(r)); + DrawTextW(di->hDC, wt, -1, &r, DT_SINGLELINE | DT_CALCRECT); + + // draw underline + y = di->rcItem.bottom - ((di->rcItem.bottom - di->rcItem.top) - (r.bottom - r.top)) / 2 - 1; + hPen = CreatePen(PS_SOLID, 0, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + hOldPen = (HPEN) SelectObject(di->hDC, hPen); + MoveToEx(di->hDC, di->rcItem.left + 2, y, NULL); + LineTo(di->hDC, di->rcItem.right + 2 - ((di->rcItem.right - di->rcItem.left) - (r.right - r.left)), y); + SelectObject(di->hDC, hOldPen); + DeleteObject(hPen); + + } + } +} diff --git a/Src/Plugins/Encoder/enc_fhgaac/link_control.h b/Src/Plugins/Encoder/enc_fhgaac/link_control.h new file mode 100644 index 00000000..a9008d48 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/link_control.h @@ -0,0 +1,7 @@ +#pragma once +#include <windows.h> + +extern "C" { +void link_startsubclass(HWND hwndDlg, UINT id); +void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/main.cpp b/Src/Plugins/Encoder/enc_fhgaac/main.cpp new file mode 100644 index 00000000..90fefb2a --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/main.cpp @@ -0,0 +1,263 @@ +#pragma comment(linker, "-nodefaultlib:libmmd.lib") +#pragma message(__FILE__": telling linker to ignore libmmd.lib") + +#include "FhGAACEncoder.h" +#include <windows.h> +#include <mmsystem.h> +#include <stdio.h> +#include "../nsv/enc_if.h" +#include "config.h" +#include "preferences.h" +#include "resource.h" +#include <api/service/waservicefactory.h> +#include "../Agave/Language/api_language.h" +#include "../winamp/wa_ipc.h" +#include "../nu/AutoWideFn.h" +#include <strsafe.h> +#include "../nu/AutoWideFn.h" +#include "encoder_common.h" +#include "ADTSAACEncoder.h" + +#define ENC_VERSION "1.08" + +HWND winampwnd = 0; +api_service *WASABI_API_SVC = 0; +api_language *WASABI_API_LNG = 0; +api_application *WASABI_API_APP = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; +HINSTANCE enc_fhg_HINST = 0; + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if (!enc_fhg_HINST) + enc_fhg_HINST = GetMyInstance(); + + if(winampwnd && !WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if (!WASABI_API_SVC) + return; + + if(!WASABI_API_APP) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid); + if (sf) WASABI_API_APP = reinterpret_cast<api_application*>(sf->getInterface()); + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncFhgAacLangGUID); + } +} + +extern "C" +{ + + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + switch(idx) + { + case 0: + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDS_ENC_FHGAAC_DESC), ENC_VERSION); + return ENCODER_TYPE_MPEG4; + case 1: + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDC_ENC_ADTS_DESC), ENC_VERSION); + return ENCODER_TYPE_ADTS; + default: + return 0; + } + } + + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (srct == mmioFOURCC('P','C','M',' ')) + { + switch(*outt) + { + case ENCODER_TYPE_MPEG4: + { + FhGAACEncoder *t=0; + AACConfigurationFile *wr = AACConfig_Create(ENCODER_TYPE_MPEG4, configfile); + if (!wr) + return 0; + + t = FhGAACEncoder::CreateDecoder(&wr->config, nch, srate, bps); + free(wr); + return t; + } + + case ENCODER_TYPE_ADTS: + { + ADTSAACEncoder *t=0; + AACConfigurationFile *wr = AACConfig_Create(ENCODER_TYPE_ADTS, configfile); + if (!wr) + return 0; + + t = ADTSAACEncoder::CreateDecoder(&wr->config, nch, srate, bps); + free(wr); + return t; + } + } + } + return NULL; + } + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, const char *configfile) + { + switch(outt) + { + case ENCODER_TYPE_MPEG4: + { + AACConfigurationFile *wr = AACConfig_Create(ENCODER_TYPE_MPEG4, configfile); + if (!wr) + return 0; + + wr->channels = 2; /* dummy defaults */ + wr->sample_rate = 44100; /* dummy defaults */ + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_PREFERENCES_MP4, hwndParent, Preferences_MP4_DlgProc, (LPARAM)wr); + } + case ENCODER_TYPE_ADTS: + { + AACConfigurationFile *wr = AACConfig_Create(ENCODER_TYPE_ADTS, configfile); + if (!wr) + return 0; + + wr->channels = 2; /* dummy defaults */ + wr->sample_rate = 44100; /* dummy defaults */ + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_PREFERENCES_ADTS, hwndParent, Preferences_ADTS_DlgProc, (LPARAM)wr); + } + + } + return NULL; + } + +#if 0 // TODO + HWND __declspec(dllexport) ConfigAudio4(HWND hwndParent, HINSTANCE hinst, unsigned int outt, const char *configfile, unsigned int channels, unsigned int sample_rate) + { + switch(outt) + { + case ENCODER_TYPE_MPEG4: + { + AACConfigurationFile *wr = (AACConfigurationFile*)calloc(1, sizeof(AACConfigurationFile)); + if (!wr) + return 0; + + if (configfile) + lstrcpynA(wr->config_file, configfile, MAX_PATH); + else + wr->config_file[0] = 0; + + wr->channels = channels; + wr->sample_rate = sample_rate; + AACConfig_Load(wr); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_PREFERENCES_MP4, hwndParent, Preferences_MP4_DlgProc, (LPARAM)wr); + } + case ENCODER_TYPE_ADTS: + { + AACConfigurationFile *wr = (AACConfigurationFile*)calloc(1, sizeof(AACConfigurationFile)); + if (!wr) + return 0; + + if (configfile) + lstrcpynA(wr->config_file, configfile, MAX_PATH); + else + wr->config_file[0] = 0; + + wr->channels = channels; + wr->sample_rate = sample_rate; + AACConfig_Load(wr); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_PREFERENCES_ADTS, hwndParent, Preferences_ADTS_DlgProc, (LPARAM)wr); + } + + } + return NULL; + } +#endif + + void __declspec(dllexport) PrepareToFinish(const char *filename, AudioCoder *coder) + { + ((EncoderCommon*)coder)->PrepareToFinish(); + } + + void __declspec(dllexport) PrepareToFinishW(const wchar_t *filename, AudioCoder *coder) + { + ((EncoderCommon*)coder)->PrepareToFinish(); + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + ((EncoderCommon*)coder)->Finish(AutoWideFn(filename)); + } + + void __declspec(dllexport) FinishAudio3W(const wchar_t *filename, AudioCoder *coder) + { + ((EncoderCommon*)coder)->Finish(filename); + } + + int __declspec(dllexport) GetConfigItem(unsigned int outt, const char *item, char *data, int len, char *configfile) + { + if (outt == mmioFOURCC('A','A','C','f')) + { + if (!lstrcmpiA(item,"extension")) + lstrcpynA(data,"m4a",len); + return 1; + } + else if (outt == mmioFOURCC('A','D','T','S')) + { + if (!lstrcmpiA(item,"extension")) + { + lstrcpynA(data,"aac",len); + } + else if (!lstrcmpiA(item,"aot")) + { + AACConfigurationFile *wr = AACConfig_Create(ENCODER_TYPE_ADTS, configfile); + if (wr) + { + StringCbPrintfA(data, len, "%u", AACConfig_GetAOT(&wr->config)); + } + else + { + StringCbPrintfA(data, len, "%u", AUD_OBJ_TYP_LC); + } + free(wr); + } + return 1; + } + return 0; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + + } +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.h b/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.h new file mode 100644 index 00000000..e7350669 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.h @@ -0,0 +1,978 @@ +/************************* Fast MPEG AAC Audio Encoder ********************** + + (C) Copyright Fraunhofer IIS (2004-2010) + All Rights Reserved + + $Id: mp4FastAAClib.h,v 1.8 2013/10/29 00:56:15 dromagod Exp $ + Initial author: M. Schug / A. Groeschel + contents/description: Fast MPEG AAC Encoder Interface Library Functions + + This software and/or program is protected by copyright law and international + treaties. Any reproduction or distribution of this software and/or program, + or any portion of it, may result in severe civil and criminal penalties, and + will be prosecuted to the maximum extent possible under law. + +******************************************************************************/ + +#ifndef _mp4FastAAClib_h_ +#define _mp4FastAAClib_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* ------------------------ structure alignment ---------------------------*/ + +#if defined(WIN32) || defined(WIN64) +#pragma pack(push, 1) +#endif + +/*-------------------------- defines --------------------------------------*/ + +/* + * calling convention + */ + +#ifndef MPEG4ENCAPI +#if defined(WIN32) || defined(WIN64) +#define MPEG4ENCAPI __stdcall +#else +#define MPEG4ENCAPI +#endif +#endif + +/*-------------------- enum definitions -----------------------------------*/ + +typedef enum +{ + AUD_OBJ_TYP_LC = 2, /* AAC LC */ + AUD_OBJ_TYP_LTP = 4, /* AAC LTP */ + AUD_OBJ_TYP_HEAAC = 5, /* AAC LC + SBR */ + AUD_OBJ_TYP_ER_LC = 17, /* ER AAC LC */ + AUD_OBJ_TYP_ER_LTP = 19, /* ER AAC LTP */ + AUD_OBJ_TYP_ER_SCAL = 20, /* ER AAC LC scalable */ + AUD_OBJ_TYP_PS = 29, /* AAC LC + SBR + PS */ + AUD_OBJ_TYP_MP2_LC = 129, /* virtual AOT MP2 Low Complexity Profile */ + AUD_OBJ_TYP_MP2_SBR = 132, /* virtual AOT MP2 Low Complexity Profile with SBR */ + AUD_OBJ_TYP_SBR_DS = 133, /* virtual AOT for downsampled SBR */ + AUD_OBJ_TYP_ER_SCAL_SBR = 148, /* ER AAC LC scalable + SBR */ + AUD_OBJ_TYP_ER_SCAL_SBR_PS = 157, /* ER AAC LC scalable + SBR + PS */ + AUD_OBJ_TYP_MPS = 30 +} AUD_OBJ_TYP; + +typedef enum { + MP4_QUAL_FAST=0, + MP4_QUAL_MEDIUM, + MP4_QUAL_HIGH, + MP4_QUAL_HIGHEST /* Always resample to preferred sample rate */ +} MPEG4ENC_QUALITY; + +typedef enum { + MP4_TT_RAW = 0, + MP4_TT_ADIF = 1, + MP4_TT_ADTS = 2, + MP4_TT_ADTSCRC = 3, + MP4_TT_LOAS = 4, + MP4_TT_LOAS_NOSMC = 5, + MP4_TT_LATM = 6, + MP4_TT_LATM_NOSMC = 7, + /* MP4_TT_LOAS_CRC = 8, */ + /* MP4_TT_LATM_CRC = 9, */ + ___mp4_tt_dummy +} MPEG4ENC_TRANSPORT_TYPE; + +typedef enum { + /* These are the standard MPEG Channel mappings */ + MP4_CH_MODE_INVALID = 0, + MP4_CH_MODE_MONO, /* 1 channel mono */ + MP4_CH_MODE_STEREO, /* 2 channel stereo */ + MP4_CH_MODE_3, /* 3 channel audio ( center + left/right front speaker ) */ + MP4_CH_MODE_4, /* 4 channel audio ( center + left/right front + rear surround speaker ) */ + MP4_CH_MODE_5, /* 5 channel audio ( center + left/right front + left/right surround speaker ) */ + MP4_CH_MODE_5_1, /* 5.1 channel audio ( center + left/right front + left/right surround speaker + LFE ) */ + MP4_CH_MODE_7_1, /* 7.1 channel audio ( center + left/right front + + left/right outside front + left/right surround speaker + LFE ) */ + /* Channel mappings 8 to 15 are reserved */ + MP4_CH_MODE_6_1 = 11, /* 6.1 channel audio ( center + front left/right + surround left/right + rear surround center + LFE ) */ + MP4_CH_MODE_7_1_REAR_SURROUND = 12, /* 7.1 channel audio ( center + front left/right + surround left/right + rear surround left/right + LFE ) */ + MP4_CH_MODE_7_1_TOP_FRONT = 14, /* 7.1 channel audio ( center + front left/right + surround left/right + LFE + + TOP front left/right ) */ + + /* Some non standard channel mappings */ + MP4_CH_MODE_DUAL_MONO = 16, /* 2 independent channels */ + MP4_CH_MODE_4TIMES1, /* 4 independent channels */ + MP4_CH_MODE_6TIMES1, /* 6 independent channels */ + MP4_CH_MODE_8TIMES1, /* 8 independent channels */ + MP4_CH_MODE_12TIMES1, /* 12 independent channels */ + MP4_CH_MODE_16TIMES1, + MP4_CH_MODE_2TIMES2, /* 2 stereo channel pairs */ + MP4_CH_MODE_3TIMES2, /* 3 stereo channel pairs */ + MP4_CH_MODE_4TIMES2, /* 4 stereo channel pairs */ + MP4_CH_MODE_6TIMES2, /* 6 stereo channel pairs */ + + MP4_CH_MODE_7_1_SIDE_CHANNEL = 32, /* 7.1 channel audio ( center + left/right front + + left/right side channels + left/right surround speakers + LFE ) */ + MP4_CH_MODE_7_1_FRONT_CENTER, /* 7.1 channel audio ( center + left/right front + + left/right frontal center speakers + left/right surround speakers + LFE ) */ + + /* Channel mapping for parametric stereo + (only works with AUD_OBJ_TYP_HEAAC, AUD_OBJ_TYP_PS) */ + MP4_CH_MODE_PARAMETRIC_STEREO = 64, /* 2 channel stereo input, transmit 1 channel mono + SBR + PS */ + MP4_CH_MODE_MPEGS_5x5 = 128, /* 6 channel input, transmit 1/2 channel(s) (+ SBR) + MPEGS Payload */ +#ifdef SUPPORT_UPMIX + MP4_CH_MODE_MPEGS_SXPRO_UPMIX, /* 2 channel input, sxPro Upmix, transmit 2 channel(s) (+ SBR) + MPEGS Payload */ +#endif +#ifdef SUPPORT_MPS_7_X_7 + MP4_CH_MODE_MPEGS_7x7_REAR_SURROUND, /* 8 channel input (5.1 + left/right side speakers), transmit 2 channel(s) (+ SBR) + MPEGS Payload */ + /* 7.1 front center channel mapping is not yet supported! */ + MP4_CH_MODE_MPEGS_7x7_FRONT_CENTER, /* 8 channel input (5.1 + left/right frontal center speakers), transmit 2 channel(s) (+ SBR) + MPEGS Payload */ +#ifdef SUPPORT_MPS_7_5_7 + MP4_CH_MODE_MPEGS_757_FRONT_CENTER, /* 8 channel input (5.1 + left/right frontal center speakers), transmit 5 channel(s) (+ SBR) + MPEGS Payload */ + MP4_CH_MODE_MPEGS_757_REAR_SURROUND, /* 8 channel input (5.1 + left/right side speakers), transmit 5 channel(s) (+ SBR) + MPEGS Payload */ +#endif /* SUPPORT_MPS_7_5_7 */ +#endif /* SUPPORT_MPS_7_X_7 */ + + /* The following channel mappings are not yet supported! */ + MP4_CH_MODE_MPEGS_5x5_BLIND, + MP4_CH_MODE_MPEGS_ARBITRARY_DOWNMIX_MONO, /* 7 channel input, transmit 1 channel (+ SBR) + MPEGS Payload */ + MP4_CH_MODE_MPEGS_ARBITRARY_DOWNMIX_STEREO /* 8 channel input, transmit 2 channel(s) (+ SBR) + MPEGS Payload */ + +} MPEG4ENC_CH_MODE; + +typedef enum { + + MP4_MPEGS_DOWNMIX_DEFAULT = 0, + /* The following config (FORCE_STEREO) is not yet supported! */ + MP4_MPEGS_DOWNMIX_FORCE_STEREO, + MP4_MPEGS_DOWNMIX_MATRIX_COMPAT, + /* The following configs are not yet supported! */ + MP4_MPEGS_DOWNMIX_ARBITRARY_MONO, + MP4_MPEGS_DOWNMIX_ARBITRARY_STEREO +#ifdef SUPPORT_MPS_7_5_7 + , MP4_MPEGS_DOWNMIX_51 +#endif /* SUPPORT_MPS_7_5_7 */ + +} MPEG4ENC_MPEGS_DOWNMIX_CONFIG; + + +typedef enum { + MPEG4ENC_NO_ERROR = 0, + MPEG4ENC_UNKNOWN_ERROR, + MPEG4ENC_PARAM_ERROR, + MPEG4ENC_NOTIMPLEMENTED_ERROR, + MPEG4ENC_MEMORY_ERROR, + MPEG4ENC_INIT_ERROR, + MPEG4ENC_FATAL_ERROR, + MPEG4ENC_STACK_ALIGNMENT_ERROR, + MPEG4ENC_METADATA_ERROR, + MPEG4ENC_AOT_NOT_SUPPORTED = 64, + MPEG4ENC_CHMODE_NOT_SUPPORTED, + MPEG4ENC_BRMODE_NOT_SUPPORTED, + MPEG4ENC_WARNING_MIN = 128, + MPEG4ENC_WARNING_STACK_ALIGNMENT = MPEG4ENC_WARNING_MIN, + MPEG4ENC_WARNING_METADATA, + MPEG4ENC_WARNING_NOSYNC_TRIGGERED +} MPEG4ENC_ERROR; + +typedef enum { + MP4_SBRSIG_IMPLICIT = 0, /* implicit signaling (signaling 1) */ + MP4_SBRSIG_EXPL_BC = 1, /* explicit backward compatible signaling (signaling 2.B.) */ + MP4_SBRSIG_EXPL_HIER = 2 /* explicit hierarchical signaling (signaling 2.A.) */ +} MPEG4ENC_SIGNALING_MODE; + +typedef enum { + MP4_MPEGS_PAYLOAD_EMBED = 0, /* in case of MPEG-4 transportation, embed payload into AAC payload */ + MP4_MPEGS_NO_PAYLOAD_EMBED = 1, /* in case of MPEG-4 transportation, do *not* embed payload into AAC payload, but transport payload in extra stream */ + MP4_MPEGS_PAYLOAD_EMBED_ASCEXT = 2 /* M16117 */ +} MPEG4ENC_MPEGS_PAYLOAD_MODE; + +typedef enum { + MP4_BR_MODE_CBR = 0, + MP4_BR_MODE_VBR_1 = 1, + MP4_BR_MODE_VBR_2 = 2, + MP4_BR_MODE_VBR_3 = 3, + MP4_BR_MODE_VBR_4 = 4, + MP4_BR_MODE_VBR_5 = 5, + MP4_BR_MODE_VBR_6 = 6, + MP4_BR_MODE_SFR = 7, /* Superframing */ + MP4_BR_MODE_DABPLUS = 8, /* Superframing + DAB+ constraints */ + MP4_BR_MODE_DRMPLUS = 9, /* Superframing + DRM+ constraints */ + MP4_BR_MODE_DMB = 10 +} MPEG4ENC_BITRATE_MODE; + +typedef enum{ + MP4_GRANULE_960 = 960, + MP4_GRANULE_1024 = 1024 +} MPEG4ENC_GRANULE_LEN; + +typedef enum { + MP4_METADATA_NONE = 0, /* do not embed any metadata */ + MP4_METADATA_MPEG, /* embed MPEG defined metadata only */ + MP4_METADATA_MPEG_ETSI /* embed all metadata */ +} MPEG4ENC_METADATA_MODE; + +typedef enum { + MP4_METADATA_DRC_NONE = 0, + MP4_METADATA_DRC_FILMSTANDARD, + MP4_METADATA_DRC_FILMLIGHT, + MP4_METADATA_DRC_MUSICSTANDARD, + MP4_METADATA_DRC_MUSICLIGHT, + MP4_METADATA_DRC_SPEECH, +#ifdef SUPPORT_METADATA_DRC_MOBILE + MP4_METADATA_DRC_MOBILE, +#endif + MP4_METADATA_DRC_EMBED_EXTERN = -1, + MP4_METADATA_DRC_NOT_PRESENT = -2 +} MPEG4ENC_METADATA_DRC_PROFILE; + +typedef enum { + MPEG4ENC_METADATA_DMX_GAIN_0_dB = 0, + MPEG4ENC_METADATA_DMX_GAIN_1_5_dB = 1, + MPEG4ENC_METADATA_DMX_GAIN_3_dB = 2, + MPEG4ENC_METADATA_DMX_GAIN_4_5_dB = 3, + MPEG4ENC_METADATA_DMX_GAIN_6_dB = 4, + MPEG4ENC_METADATA_DMX_GAIN_7_5_dB = 5, + MPEG4ENC_METADATA_DMX_GAIN_9_dB = 6, + MPEG4ENC_METADATA_DMX_GAIN_INF = 7, +} MPEG4ENC_METADATA_DMX_GAIN; + +typedef enum { + MP4_METADATA_DSUR_NOT_INDICATED = 0, /* Dolby Surround mode not indicated */ + MP4_METADATA_DSUR_NOT_USED = 1, /* 2-ch audio part is not Dolby surround encoded */ + MP4_METADATA_DSUR_IS_USED = 2 /* 2-ch audio part is Dolby surround encoded */ +} MPEG4ENC_METADATA_DSUR_IND; + +typedef enum { /* see ETSI TS 101 154 V1.11.1, section C.5.2.2.3 and C.5.3 */ + MP4_METADATA_DRCPRESENTATION_NOT_INDICATED = 0, + MP4_METADATA_DRCPRESENTATION_MODE_1 = 1, + MP4_METADATA_DRCPRESENTATION_MODE_2 = 2 +} MPEG4ENC_METADATA_DRCPRESENTATION; + +typedef enum { + MP4_MAX_ASC_SIZE = 64, + MP4_MAX_SMC_SIZE = 256, + MAX_DRC_BANDS = (1<<4), + MP4_MAX_NUM_STREAMS = 2 +} MPEG4ENC_DEFINES; + + +typedef enum { + MPEG4ENC_SYNCFRAME_STARTUP = 0, + MPEG4ENC_SYNCFRAME_SWITCH, + MPEG4ENC_SYNCFRAME_DASH +} MPEG4ENC_SYNCFRAME_TYPES; + +typedef enum { + MP4_MPSDMXGAIN_INVALID = -1, + MP4_MPSDMXGAIN_0_dB = 0, + MP4_MPSDMXGAIN_1_5_dB = 1, + MP4_MPSDMXGAIN_3_dB = 2, + MP4_MPSDMXGAIN_4_5_dB = 3, + MP4_MPSDMXGAIN_6_dB = 4, + MP4_MPSDMXGAIN_7_5_dB = 5, + MP4_MPSDMXGAIN_9_dB = 6, + MP4_MPSDMXGAIN_12_dB = 7 +} MPEG4ENC_MPS_DMX_GAIN; + +#ifdef SUPPORT_UPMIX +typedef enum { + MP4_SXPRO_DEFAULT = 0, + MP4_SXPRO_DRY, + MP4_SXPRO_VIBRANT +} MP4_SXPRO_UPMIX_WORKMODE; + +typedef enum { + MP4_SXPRO_LFE_OFF = 0, + MP4_SXPRO_LFE_ON +} MP4_SXPRO_UPMIX_LFE; +#endif + +/*-------------------- structure definitions ------------------------------*/ + +typedef struct { + AUD_OBJ_TYP aot; + int nBitRate; + MPEG4ENC_BITRATE_MODE bitrateMode; + MPEG4ENC_QUALITY quality; + MPEG4ENC_CH_MODE chMode; + int nSampleRateIn; + MPEG4ENC_TRANSPORT_TYPE transportFormat; + MPEG4ENC_SIGNALING_MODE sbrSignaling; + MPEG4ENC_GRANULE_LEN nGranuleLength; + MPEG4ENC_METADATA_MODE metadataMode; +} MPEG4ENC_SETUP; + +typedef enum{ + MP4_THREADING_MODE_SINGLE = 1, + MP4_THREADING_MODE_MULTIPLE_BLOCKING, + MP4_THREADING_MODE_MULTIPLE_NOBLOCKING +} MPEG4ENC_THREADING_MODE; + + +typedef MPEG4ENC_SETUP *HANDLE_MPEG4ENC_SETUP; + +struct MPEG4ENC_ENCODER; +typedef struct MPEG4ENC_ENCODER * HANDLE_MPEG4ENC_ENCODER; + +typedef struct +{ + int nOutputStreams; /* number of output streams */ + int nAccessUnitsPerStream[MP4_MAX_NUM_STREAMS]; /* number of AUs in bitstream buffer */ + int *pnAccessUnitOffset[MP4_MAX_NUM_STREAMS]; /* offset of AUs per stream, i.e. pnAccessUnitOffset[stream][numberAuPerStream] */ + int *pByteCnt[MP4_MAX_NUM_STREAMS]; /* lenght of each single AU in bitstream buffer */ + int *pIsSync[MP4_MAX_NUM_STREAMS]; /* flag, signaling if AU is self contained i.e. does not contain backward dependencies */ +} MPEG4ENC_AUINFO; + +typedef struct { + int nAscSizeBits; + unsigned char ascBuffer[MP4_MAX_ASC_SIZE]; +} MPEG4ENC_ASCBUF; + +typedef struct { + int nSmcSizeBits; + unsigned char smcBuffer[MP4_MAX_ASC_SIZE]; +} MPEG4ENC_SMCBUF; + +typedef struct +{ + float fBandWidth; /* audio bandwidth in Hz */ + int nDelay; /* encoder delay in units of sample frames */ + int nDelayCore; /* encoder delay in units of sample frames */ + int nCbBufSizeMin; /* minimum size of output buffer (bytes) */ + int nSyncFrameDelay; + + int nBitRate[MP4_MAX_NUM_STREAMS]; + int nMaxBitRate[MP4_MAX_NUM_STREAMS]; + int nBitResMax[MP4_MAX_NUM_STREAMS]; + int nSamplingRate[MP4_MAX_NUM_STREAMS]; + int nSamplesFrame[MP4_MAX_NUM_STREAMS]; + + unsigned int nAncBytesPerFrame; + int aot; + int nValidAsc; + MPEG4ENC_ASCBUF ascBuf[MP4_MAX_NUM_STREAMS]; + MPEG4ENC_SMCBUF smcBuf; + int nProfLev; + + char pVersion[50]; + char pBuildDate[50]; + +} MPEG4ENC_INFO; + +typedef struct MPEG4ENC_METADATA +{ + MPEG4ENC_METADATA_DRC_PROFILE drc_profile; /* MPEG DRC compression profile */ + MPEG4ENC_METADATA_DRC_PROFILE comp_profile; /* ETSI heavy compression profile */ + + float drc_TargetRefLevel; /* used to define expected level to */ + float comp_TargetRefLevel; /* adjust limiter to avoid overload */ + + float drc_ext; /* external feed DRC compression value */ + float comp_ext; /* external feed heavy compression value */ + + int prog_ref_level_present; /* flag, if prog_ref_level is present */ + float prog_ref_level; /* Programme Reference Level = Dialogue Level: */ + /* -31.75dB .. 0 dB ; stepsize: 0.25dB */ + + int PCE_mixdown_idx_present; /* flag, if dmx-idx should be written in programme config element */ + int ETSI_DmxLvl_present; /* flag, if dmx-lvl should be written in ETSI-ancData */ + MPEG4ENC_METADATA_DMX_GAIN centerMixLevel; /* center downmix level */ + MPEG4ENC_METADATA_DMX_GAIN surroundMixLevel; /* surround downmix level */ + + MPEG4ENC_METADATA_DSUR_IND dolbySurroundMode; /* Indication for Dolby Surround Encoding Mode */ + + MPEG4ENC_METADATA_DRCPRESENTATION drcPresentationMode; /* DRC presentation mode (ETSI) */ + + /* preprocessing */ + int dcFilter; /* flag specifying if DC filtering is applied to input */ + int lfeLowpassFilter; /* flag specifying if 120 Hz low-pass filter is applied to LFE channel */ + int surPhase90; /* flag specifying if 90 degree phase shift is applied to surround channels */ + int surAtt3dB; /* flag specifying if 3 dB attenuation is applied to surround channels */ + +} MPEG4ENC_METADATA; + +typedef struct MPEG4ENC_EXTMETADATA +{ +#if 1 /* ENABLE_ISO14496_3_2009_AMD4 */ + /* not fully supported yet */ + /* extended ancillary data */ + int pseudoSurroundEnable; /* flag */ + int extAncDataEnable; /* flag */ + int extDownmixLevelEnable; /* flag */ + int extDownmixLevel_A; /* downmix level index A (0...7, according to table) */ + int extDownmixLevel_B; /* downmix level index B (0...7, according to table) */ + int dmxGainEnable; /* flag */ + float dmxGain5; /* gain factor for downmix to 5 channels */ + float dmxGain2; /* gain factor for downmix to 2 channels */ + int lfeDmxEnable; /* flag */ + int lfeDmxLevel; /* downmix level index for LFE (0..15, according to table) */ +#endif +} MPEG4ENC_EXTMETADATA; + +typedef struct MPEG4ENC_METADATA *HANDLE_MPEG4ENC_METADATA; +typedef struct MPEG4ENC_EXTMETADATA *HANDLE_MPEG4ENC_EXTMETADATA; + + +/*-------------------- function prototypes --------------------------------*/ + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Configure + description : fills encoder handle structure with default values + to be called before MPEG4ENC_Open + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Configure ( + HANDLE_MPEG4ENC_ENCODER *phMp4Enc, /* adress of encoder handle */ + const HANDLE_MPEG4ENC_SETUP hSetup /* handle to filled setup stucture */ + ); + +/*--------------------------------------------------------------------------- + + functionname:MPEG4ENC_GetVersionInfo + description: get Version Number information about the encoding process + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_GetVersionInfo(char *const pVersionInfo, + const int bufSize); + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Open + description: allocate and initialize a new encoder instance + samplesFirst holds the desired number of input + samples (of all channels) for the first frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ---------------------------------------------------------------------------*/ + +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Open( + HANDLE_MPEG4ENC_ENCODER *phMp4Enc, /* pointer to encoder handle, initialized on return */ + unsigned int* const pSamplesFirst /* number of samples needed to encode the first frame */ + ); + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Close + description: deallocate an encoder instance + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ---------------------------------------------------------------------------*/ + +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Close ( + HANDLE_MPEG4ENC_ENCODER* phMp4Enc /* pointer to an encoder handle */ + ); + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Encode + description: encode the passed samples + modifies: pSamplesConsumed: number of used samples + pSamplesNext: number of samples needed to encode + the next frame + pOutputBytes: number of valid bytes in pOutput + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ---------------------------------------------------------------------------*/ + +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Encode( + HANDLE_MPEG4ENC_ENCODER const hMp4Enc, /* an encoder handle */ + const float* const pSamples, /* pointer to audio samples, interleaved*/ + const int nSamples, /* number of samples + must be a multiple of number of input channels */ + int* pSamplesConsumed, /* number of used input samples, + will be a multiple of number of input channels */ + unsigned int* const pSamplesNext, /* number of desired samples for a complete frame */ + unsigned char* const pOutput, /* pointer to bitstream buffer */ + const int nOutputBufSize, /* the size of the output buffer; + must be large enough to receive all data */ + int* const pOutputBytes, /* number of bytes in bitstream buffer */ + MPEG4ENC_AUINFO **ppAuInfo /* */ + ); + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SRInfo + description : returns the sample rate range and + to be called before MPEG4ENC_Open + returns: MPEG4ENC_NO_ERROR on success, + MPEG4ENC_INIT_ERROR if the bitrate, channel, aot configuration + is not supported + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SRInfo ( + + const int bitRate, /* the targeted bit rate */ + const MPEG4ENC_BITRATE_MODE bitrateMode, /* the bitrateMode */ + const MPEG4ENC_CH_MODE chMode, /* the number of channels to encode */ + const AUD_OBJ_TYP aot, /* the audio object type */ + const MPEG4ENC_QUALITY quality, /* encoder quality */ + int *const sampleRateMin, /* lowest supported */ + int *const sampleRateMax, /* highest supported */ + int *const sampleRatePref /* preferred + sampling frequency for the given + bitrate, channel, aot configuration */ + ); + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_GetInfo + description: get information about the encoding process + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_GetInfo(const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + MPEG4ENC_INFO * const pInfo); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetAncDataRate + description: Sets bitrate for ancillary data + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetAncDataRate( + HANDLE_MPEG4ENC_ENCODER hMp4Enc, + int nAncDataRate + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetAncData + description: Passes ancillary data to encoder + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetAncData( + HANDLE_MPEG4ENC_ENCODER const hMp4Enc, /* an encoder handle */ + unsigned char* pAncBytes, /* ancillary data buffer */ + unsigned int* pNumAncBytes /* ancillary data bytes left */ + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetOffsets + description: changes mapping of input audio channels to AAC channels + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetOffsets( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const unsigned int nChannels, + const unsigned int *const channelOffset + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSbrTransmissionConfig + description: changes signaling interval of SBR header, additional CRC bits + for SBR data + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSbrTransmissionConfig( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const int bUseCRC, + const float sendHeaderTimeInterval + ); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetInbandPceTimeInterval + description: set update interval for explicit in band PCE transmission + sendPceTimeInterval > 0 -> regular time interval in seconds + sendPceTimeInterval == 0 -> send no PCE (MPEG-2 only) + sendPceTimeInterval < 0 -> send PCE only the 1st frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetInbandPceTimeInterval(const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const float sendPceTimeInterval); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetAdtsPceTimeInterval + description: set update interval for explicit channel signaling via PCE in + case of ADTS transport stream, MPEG-2/4 AAC and + channel_configuration == 0 + sendPceTimeInterval > 0 -> regular time interval in seconds + sendPceTimeInterval == 0 -> send no PCE (MPEG-2 only) + sendPceTimeInterval < 0 -> send PCE only the 1st frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetAdtsPceTimeInterval( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const float sendPceTimeInterval + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_MpsSetSscTimeInterval + description: set update interval for transmission of SpatialSpecificConfig + (SSC) in case of encoding using MPEG Surround + sendSscTimeInterval > 0 -> regular time interval in seconds + sendSscTimeInterval == 0 -> send SSC every (MPEGS) frame + sendSscTimeInterval < 0 -> send SSC only the 1st frame + - in combination with MPEGS only + - MPEGS payload mode has to be MP4_MPEGS_PAYLOAD_EMBED, because + otherwise the SSC is transmitted in a seperate ESD, which has + to be handled by the user + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_MpsSetSscTimeInterval( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const float sendSscTimeInterval + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_MpsSetDownmixConfig + description: set MPEG Surround Downmix Configuration + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_MpsSetDownmixConfig( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MPEG4ENC_MPEGS_DOWNMIX_CONFIG mpegsDownmixCfg + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_MpsSetPayloadMode + description: set MPEG Surround Payload Transmission Mode + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_MpsSetPayloadMode( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MPEG4ENC_MPEGS_PAYLOAD_MODE mpegsPayloadMode + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetThreadingMode (deprecated) + description: sets threading mode to single threaded, multiple threaded + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + Please note that this function is deprecated and should not be used any more. + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetThreadingMode(const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MPEG4ENC_THREADING_MODE threadingMode); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_GetError + description: get error text + returns: pointer to an error text + + ------------------------------------------------------------------------------*/ +char* MPEG4ENCAPI +MPEG4ENC_GetError(MPEG4ENC_ERROR error); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetBandwidth + description: set bandwidth by user, returns with actual used bandwidth + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetBandwidth(const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const float proposedBandwidth, + float* usedBandwidth); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetStereoPrePro + description: set bandwidth by user, returns with actual used bandwidth + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetStereoPrePro(const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const int enableStereoPrePro); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetLatmSmcTimeInterval + description: set update interval for appearance of stream mux config in + case of LOAS/LATM transport stream + sendSmcTimeInterval > 0 -> regular time interval (every n-th frame, default: 8) + sendSmcTimeInterval == 0 -> send no inband StreamMuxConfig + sendSmcTimeInterval < 0 -> send StreamMuxConfig only the 1st frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetLatmSmcTimeInterval( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const int sendSmcTimeInterval + ); + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetLatmNrOfSubframes + description: set the nr of subframes per latm frame in + case of LOAS/LATM transport stream + nrOfSubframes < 1 -> reserved + nrOfSubframes >= 1 -> use 'nrOfSubframes' + + optional, default is 1 + + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetLatmNrOfSubframes( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const int nrOfSubframes + ); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_GetLatmSmc + description: returns pointer to and size of LATM stream mux config + + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_GetLatmSmc( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + unsigned char** buffer, + int* nBits + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Submit_Metadata + description: submit metadata + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Submit_Metadata( + const HANDLE_MPEG4ENC_ENCODER hMpeg4Enc, /* an encoder handle */ + const HANDLE_MPEG4ENC_METADATA pMetadata /* pointer to metadata */ + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_Submit_ExtMetadata + description: submit metadata + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_Submit_ExtMetadata( + const HANDLE_MPEG4ENC_ENCODER hMpeg4Enc, /* an encoder handle */ + const HANDLE_MPEG4ENC_EXTMETADATA pExtMetadata /* pointer to extended metadata */ + ); + + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_BRInfo + description : Provides the compatible bitrate range + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_BRInfo ( + const AUD_OBJ_TYP aot, + const MPEG4ENC_CH_MODE chMode, + const int samplingRate, + int* brMin, + int* brMax); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSbrSpeechConfig + description : Sets SBR Speech config flag + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSbrSpeechConfig( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + unsigned int flag + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSbrTimeDiffCoding + description : Sets SBR time differential coding (TDC); + flag==0: Do not use TDC + flag==1: Use TDC + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSbrTimeDiffCoding( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + unsigned int flag + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetUseIntensityStereo + description : Sets intensity stereo coding (IS); + flag==1: Use IS (default) + flag==0: Do not use IS + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetUseIntensityStereo( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + unsigned int flag + ); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SendChCfgZero + description: will always use channel config zero + pce although a standard + channel config could be signalled + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SendChCfgZero( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc + ); + + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSyncFrame + description: will generate a synchaable frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSyncFrame( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc + ); + + +/*----------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSyncFrameWithType + description: will generate a synchaable frame + returns: MPEG4ENC_NO_ERROR on success, an appropriate error code else + + ------------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSyncFrameWithType( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MPEG4ENC_SYNCFRAME_TYPES syncType + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_InitDASH + description : Configure encoder for DASH mode + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_InitDASH( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetTransportType + description : Reconfigure Transport Format + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetTransportType( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MPEG4ENC_TRANSPORT_TYPE transportType + ); + + +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetMPEG4Flag + description : Reconfigure MPEG-2/4 compliance + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetMPEG4Flag( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const int mpeg4Flag + ); + + +#ifdef SUPPORT_UPMIX +/*--------------------------------------------------------------------------- + + functionname: MPEG4ENC_SetSXProUpmixParameter + description : Sets SXPro parameters; + umxMode: Upmix workmode + umxLFE: Upmix LFE on/off + returns: MPEG4ENC_ERROR (error code) + + ---------------------------------------------------------------------------*/ +MPEG4ENC_ERROR MPEG4ENCAPI +MPEG4ENC_SetSXProUpmixParameter( + const HANDLE_MPEG4ENC_ENCODER hMp4Enc, + const MP4_SXPRO_UPMIX_WORKMODE umxMode, + const MP4_SXPRO_UPMIX_LFE umxLFE + ); +#endif + + +/*---------------------------------------------------------------------------*/ +#if defined(WIN32) || defined(WIN64) +#pragma pack(pop) +#endif + +/*-------------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _mp4FastAAClib_h_ */ diff --git a/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.lib b/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.lib Binary files differnew file mode 100644 index 00000000..842651eb --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/mp4FastAAClib.lib diff --git a/Src/Plugins/Encoder/enc_fhgaac/preferences.cpp b/Src/Plugins/Encoder/enc_fhgaac/preferences.cpp new file mode 100644 index 00000000..2c853b1e --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/preferences.cpp @@ -0,0 +1,122 @@ +#include "preferences.h" +#include "resource.h" +#include "../nu/ComboBox.h" +#include "../nu/Slider.h" +#include "../Agave/Language/api_language.h" +#include <strsafe.h> +/* note to maintainers: +the combobox code assumes that the options are in numerical order starting from 0 +if this assumption ever changes, you'll need to map AAC_MODE_* and AAC_PROFILE_* to/from indices +there are some asserts to test this (which will only test in debug mode of course) +*/ +const int bitrate_slider_precision = 4; + +static void SetSliderBitrate(HWND hwnd, unsigned int bitrate) +{ + Slider preset_slider(hwnd, IDC_SLIDER_PRESET); + int low = (unsigned int)SendMessage(GetDlgItem(hwnd,IDC_SLIDER_PRESET), TBM_GETRANGEMIN, 0, 0); + int position = (bitrate - low)/bitrate_slider_precision + low; + preset_slider.SetPosition(position, Slider::REDRAW); +} + +unsigned int GetSliderBitrate(HWND hwnd) +{ + int low = (unsigned int)SendMessage(GetDlgItem(hwnd,IDC_SLIDER_PRESET), TBM_GETRANGEMIN, 0, 0); + int position = SendMessage(GetDlgItem(hwnd,IDC_SLIDER_PRESET),TBM_GETPOS,0,0); + unsigned int bitrate = (position - low)*bitrate_slider_precision + low; + return bitrate; +} + +void UpdateInfo(HWND hwnd, const AACConfiguration *config) +{ + wchar_t temp[128] = {0}; + + switch(AACConfig_GetAOT(config)) + { + case AUD_OBJ_TYP_LC: + SetDlgItemText(hwnd, IDC_INFO_MODE, L"MPEG-4 AAC LC"); + break; + case AUD_OBJ_TYP_HEAAC: + SetDlgItemText(hwnd, IDC_INFO_MODE, L"MPEG-4 HE-AAC"); + break; + case AUD_OBJ_TYP_PS: + SetDlgItemText(hwnd, IDC_INFO_MODE, L"MPEG-4 HE-AACv2"); + break; + } + if (config->mode == AAC_MODE_VBR) + { + StringCbPrintfW(temp, sizeof(temp), WASABI_API_LNGSTRINGW(IDS_VBR_PRESET), config->preset, AACConfig_GetBitrate(config, 2 /* TODO! */)/1000); + SetDlgItemText(hwnd, IDC_INFO_BITRATE, temp); + } + else + { + StringCbPrintfW(temp, sizeof(temp), WASABI_API_LNGSTRINGW(IDS_CBR_PRESET), AACConfig_GetBitrate(config, 2 /* TODO! */)/1000); + SetDlgItemText(hwnd, IDC_INFO_BITRATE, temp); + } +} + +/* call this to update the UI according to the configuration values */ +void UpdateUI(HWND hwnd, AACConfigurationFile *config) +{ + wchar_t temp[128] = {0}; + ComboBox mode_list(hwnd, IDC_MODE); + ComboBox profile_list(hwnd, IDC_PROFILE); + + config->changing = true; + Slider preset_slider(hwnd, IDC_SLIDER_PRESET); + if (config->config.mode == AAC_MODE_VBR) + { + preset_slider.SetRange(1, 6, Slider::REDRAW); + preset_slider.SetTickFrequency(1); + preset_slider.SetPosition(config->config.preset, Slider::REDRAW); + SetDlgItemText(hwnd, IDC_STATIC_PRESET, WASABI_API_LNGSTRINGW(IDS_PRESET)); + StringCbPrintf(temp, sizeof(temp), L"%u", config->config.preset); + SetDlgItemText(hwnd, IDC_EDIT_PRESET, temp); + profile_list.SelectItem(AAC_PROFILE_AUTOMATIC); + EnableWindow(profile_list, FALSE); + ShowWindow(GetDlgItem(hwnd, IDC_KBPS), SW_HIDE); + } + else /* implied: if (config->config.mode == AAC_MODE_CBR) */ + { + int low, high; + AACConfig_GetBitrateRange(&config->config, &low, &high); + low = ((low/1000+3)&~3); /* convert to kbps round up to nearest multiple of 4 */ + high = ((high/1000)&~3); /* convert to kbps round down to nearest multiple of 4 */ + + int slider_high = low + (high - low)/bitrate_slider_precision; + preset_slider.SetRange(low, slider_high, Slider::REDRAW); + if (config->config.profile >= AAC_PROFILE_HE) + preset_slider.SetTickFrequency(1); + else + preset_slider.SetTickFrequency(4); + SetSliderBitrate(hwnd, config->config.bitrate); + config->config.bitrate = GetSliderBitrate(hwnd); + SetDlgItemText(hwnd, IDC_STATIC_PRESET, WASABI_API_LNGSTRINGW(IDS_BITRATE)); + StringCbPrintf(temp, sizeof(temp), L"%u", config->config.bitrate); + SetDlgItemText(hwnd, IDC_EDIT_PRESET, temp); + profile_list.SelectItem(config->config.profile); + EnableWindow(profile_list, TRUE); + ShowWindow(GetDlgItem(hwnd, IDC_KBPS), SW_SHOWNA); + } + config->changing = false; +} + +int Preferences_GetEncoderVersion(char *version_string, 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++; + } + + StringCchPrintfA(version_string, cch, WASABI_API_LNGSTRING(IDS_VERSION), version); + + return 0; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/preferences.h b/Src/Plugins/Encoder/enc_fhgaac/preferences.h new file mode 100644 index 00000000..0ed9cabc --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/preferences.h @@ -0,0 +1,18 @@ +#pragma once +#include <windows.h> +#include "config.h" + +extern HINSTANCE enc_fhg_HINST; +INT_PTR CALLBACK Preferences_MP4_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK Preferences_ADTS_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +/* common to both */ +extern const int bitrate_slider_precision; +void UpdateInfo(HWND hwnd, const AACConfiguration *config); +void UpdateUI(HWND hwnd, AACConfigurationFile *config); +int Preferences_GetEncoderVersion(char *version_string, size_t cch); +unsigned int GetSliderBitrate(HWND hwnd); + +#include <api/application/api_application.h> +extern api_application *applicationApi; +#define WASABI_API_APP applicationApi
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/preferences_adts.cpp b/Src/Plugins/Encoder/enc_fhgaac/preferences_adts.cpp new file mode 100644 index 00000000..88231e5a --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/preferences_adts.cpp @@ -0,0 +1,124 @@ +#include "../Agave/Language/api_language.h" +#include "config.h" +#include "preferences.h" +#include "../Winamp/wa_ipc.h" +#include <windows.h> +#include <assert.h> +#include "resource.h" +#include "link_control.h" +#include "../nu/ComboBox.h" +#include "../nu/Slider.h" +#include <strsafe.h> + +extern HWND winampwnd; + +INT_PTR CALLBACK Preferences_ADTS_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + AACConfigurationFile *cfg = (AACConfigurationFile *)lParam; + cfg->changing = false; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)cfg); + + + if (cfg->shoutcast == 1) + { + ShowWindow(GetDlgItem(hwnd, IDC_WARNING), SW_HIDE); + } + + ComboBox profile_list(hwnd, IDC_PROFILE); + profile_list.AddString(WASABI_API_LNGSTRINGW(IDS_AUTOMATIC), AAC_PROFILE_AUTOMATIC); assert(AAC_PROFILE_AUTOMATIC == 0); + profile_list.AddString(L"AAC LC", AAC_PROFILE_LC); assert(AAC_PROFILE_LC == 1); + profile_list.AddString(L"HE-AAC", AAC_PROFILE_HE); assert(AAC_PROFILE_HE == 2); + profile_list.AddString(L"HE-AAC v2", AAC_PROFILE_HE_V2); assert(AAC_PROFILE_HE_V2 == 3); + + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + link_startsubclass(hwnd, IDC_URL); + link_startsubclass(hwnd, IDC_LOGO); + link_startsubclass(hwnd, IDC_HELPLINK); + + char temp[128] = {0}; + if (Preferences_GetEncoderVersion(temp, sizeof(temp)/sizeof(*temp)) == 0) + { + SetDlgItemTextA(hwnd, IDC_VERSION, temp); + } + + // this will make sure that we've got the aacplus logo shown even when using a localised version + SendDlgItemMessage(hwnd,IDC_LOGO,STM_SETIMAGE,IMAGE_BITMAP, (LPARAM)LoadImage(WASABI_API_ORIG_HINST?WASABI_API_ORIG_HINST:enc_fhg_HINST,MAKEINTRESOURCE(IDB_FHGLOGO),IMAGE_BITMAP,0,0,LR_SHARED)); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_HELPLINK: + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://help.winamp.com/", IPC_OPEN_URL); + break; + case IDC_LOGO: + case IDC_URL: + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://www.iis.fraunhofer.de/en/bf/amm", IPC_OPEN_URL); + break; + + case IDC_EDIT_PRESET: + if (HIWORD(wParam) == EN_CHANGE) + { + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (!cfg->changing) + { + BOOL s=0; + unsigned int t=GetDlgItemInt(hwnd,IDC_EDIT_PRESET,&s,0); + if (s) + { + cfg->config.bitrate = t; + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + } + } + break; + + case IDC_PROFILE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + cfg->config.profile = (unsigned int)ComboBox(hwnd, IDC_PROFILE).GetSelection(); + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + break; + } + break; + + case WM_HSCROLL: + if (GetDlgItem(hwnd, IDC_SLIDER_PRESET) == (HWND)lParam) + { + wchar_t temp[128] = {0}; + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + + cfg->config.bitrate = GetSliderBitrate(hwnd); + StringCbPrintf(temp, sizeof(temp), L"%u", cfg->config.bitrate); + SetDlgItemText(hwnd, IDC_EDIT_PRESET, temp); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + break; + } + + link_handledraw(hwnd,msg,wParam,lParam); + + const int controls[] = + { + IDC_SLIDER_PRESET, + }; + if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwnd, msg, wParam, lParam, controls, ARRAYSIZE(controls))) + { + return 1; + } + + return 0; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/preferences_mp4.cpp b/Src/Plugins/Encoder/enc_fhgaac/preferences_mp4.cpp new file mode 100644 index 00000000..7f06dfb0 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/preferences_mp4.cpp @@ -0,0 +1,152 @@ +#include "../Agave/Language/api_language.h" +#include "config.h" +#include "preferences.h" +#include "../Winamp/wa_ipc.h" +#include <windows.h> +#include <assert.h> +#include "resource.h" +#include "link_control.h" +#include "../nu/ComboBox.h" +#include "../nu/Slider.h" +#include <strsafe.h> + +extern HWND winampwnd; + +INT_PTR CALLBACK Preferences_MP4_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + AACConfigurationFile *cfg = (AACConfigurationFile *)lParam; + cfg->changing = false; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)cfg); + + ComboBox mode_list(hwnd, IDC_MODE); + mode_list.AddString(WASABI_API_LNGSTRINGW(IDS_VBR), AAC_MODE_VBR); assert(AAC_MODE_VBR == 0); + mode_list.AddString(WASABI_API_LNGSTRINGW(IDS_CBR), AAC_MODE_CBR); assert(AAC_MODE_CBR == 1); + mode_list.SelectItem(cfg->config.mode); + + ComboBox profile_list(hwnd, IDC_PROFILE); + profile_list.AddString(WASABI_API_LNGSTRINGW(IDS_AUTOMATIC), AAC_PROFILE_AUTOMATIC); assert(AAC_PROFILE_AUTOMATIC == 0); + profile_list.AddString(L"AAC LC", AAC_PROFILE_LC); assert(AAC_PROFILE_LC == 1); + profile_list.AddString(L"HE-AAC", AAC_PROFILE_HE); assert(AAC_PROFILE_HE == 2); + profile_list.AddString(L"HE-AAC v2", AAC_PROFILE_HE_V2); assert(AAC_PROFILE_HE_V2 == 3); + + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + link_startsubclass(hwnd, IDC_URL); + link_startsubclass(hwnd, IDC_LOGO); + link_startsubclass(hwnd, IDC_HELPLINK); + + char temp[128] = {0}; + if (Preferences_GetEncoderVersion(temp, sizeof(temp)/sizeof(*temp)) == 0) + { + SetDlgItemTextA(hwnd, IDC_VERSION, temp); + } + + // this will make sure that we've got the aacplus logo shown even when using a localised version + SendDlgItemMessage(hwnd,IDC_LOGO,STM_SETIMAGE,IMAGE_BITMAP, (LPARAM)LoadImage(WASABI_API_ORIG_HINST?WASABI_API_ORIG_HINST:enc_fhg_HINST,MAKEINTRESOURCE(IDB_FHGLOGO),IMAGE_BITMAP,0,0,LR_SHARED)); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_HELPLINK: + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://help.winamp.com/", IPC_OPEN_URL); + break; + case IDC_LOGO: + case IDC_URL: + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://www.iis.fraunhofer.de/en/bf/amm", IPC_OPEN_URL); + break; + + + case IDC_MODE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + cfg->config.mode = (unsigned int)ComboBox(hwnd, IDC_MODE).GetSelection(); + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + break; + + case IDC_EDIT_PRESET: + if (HIWORD(wParam) == EN_CHANGE) + { + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (!cfg->changing) + { + BOOL s=0; + unsigned int t=GetDlgItemInt(hwnd,IDC_EDIT_PRESET,&s,0); + if (s) + { + if (cfg->config.mode == AAC_MODE_VBR) + { + cfg->config.preset= t; + } + else + { + cfg->config.bitrate = t; + } + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + } + } + break; + + case IDC_PROFILE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + cfg->config.profile = (unsigned int)ComboBox(hwnd, IDC_PROFILE).GetSelection(); + UpdateUI(hwnd, cfg); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + break; + } + break; + + case WM_HSCROLL: + if (GetDlgItem(hwnd, IDC_SLIDER_PRESET) == (HWND)lParam) + { + wchar_t temp[128] = {0}; + AACConfigurationFile *cfg = (AACConfigurationFile *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (cfg->config.mode == AAC_MODE_VBR) + { + cfg->config.preset = (unsigned int)SendMessage(GetDlgItem(hwnd,IDC_SLIDER_PRESET),TBM_GETPOS,0,0); + StringCbPrintf(temp, sizeof(temp), L"%u", cfg->config.preset); + SetDlgItemText(hwnd, IDC_EDIT_PRESET, temp); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + else + { + cfg->config.bitrate = GetSliderBitrate(hwnd); + StringCbPrintf(temp, sizeof(temp), L"%u", cfg->config.bitrate); + SetDlgItemText(hwnd, IDC_EDIT_PRESET, temp); + UpdateInfo(hwnd, &cfg->config); + AACConfig_Save(cfg); + } + } + break; + } + + link_handledraw(hwnd,msg,wParam,lParam); + + const int controls[] = + { + IDC_SLIDER_PRESET, + }; + if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwnd, msg, wParam, lParam, controls, ARRAYSIZE(controls))) + { + return 1; + } + + return 0; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_fhgaac/resource.h b/Src/Plugins/Encoder/enc_fhgaac/resource.h new file mode 100644 index 00000000..9904233d --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/resource.h @@ -0,0 +1,46 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by enc_fhgaac.rc +// +#define IDS_ENC_FHGAAC_DESC 1 +#define VS_VERSION_INFO 1 +#define IDS_ENC_FHGAAC_VER 2 +#define IDS_VBR_PRESET 2 +#define IDS_CBR_PRESET 3 +#define IDS_VBR 4 +#define IDS_CBR 5 +#define IDS_AUTOMATIC 6 +#define IDS_BITRATE 7 +#define IDS_PRESET 8 +#define IDD_PREFERENCES_MP4 9 +#define IDS_VERSION 9 +#define IDD_PREFERENCES_ADTS 10 +#define IDC_ENC_ADTS_DESC 10 +#define IDB_FHGLOGO 104 +#define IDC_MODE 1002 +#define IDC_PROFILE 1003 +#define IDC_STATIC_PROFILE 1004 +#define IDC_STATIC_PRESET 1006 +#define IDC_SLIDER_PRESET 1007 +#define IDC_EDIT_PRESET 1008 +#define IDC_INFO_MODE 1009 +#define IDC_INFO_BITRATE 1010 +#define IDC_INFO_WARNING 1011 +#define IDC_KBPS 1014 +#define IDB_LOGO 1015 +#define IDC_LOGO 1015 +#define IDC_URL 1017 +#define IDC_HELPLINK 1018 +#define IDC_VERSION 1019 +#define IDC_WARNING 1020 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1021 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_fhgaac/version.rc2 b/Src/Plugins/Encoder/enc_fhgaac/version.rc2 new file mode 100644 index 00000000..f94ece26 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,8,0 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "1,0,8,0" + VALUE "InternalName", "Nullsoft AAC Encoder" + VALUE "LegalCopyright", "Copyright © 2011-2019 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_fhgaac.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.cpp b/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.cpp new file mode 100644 index 00000000..38bb124e --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.cpp @@ -0,0 +1,203 @@ +#include "AudioCoderFlac.h" +#include <bfc/platform/types.h> +#include <FLAC/metadata.h> + +AudioCoderFlac::AudioCoderFlac(unsigned int nch, unsigned int bps, unsigned int samplerate, unsigned int compression) +{ + /* initialize stuff first so we can clean up safely if things go wrong */ + finished = false; + finishedBytes = 0; + padding = 0; + encoder = 0; + win32State.bytesWritten = 0; + win32State.handle = INVALID_HANDLE_VALUE; + tempFile[0]=0; + + wchar_t tempPath[MAX_PATH-14] = {0}; + GetTempPath(MAX_PATH-14, tempPath); + GetTempFileName(tempPath, L"wfl", 0, tempFile); + win32State.handle = CreateFile(tempFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + + if (win32State.handle != INVALID_HANDLE_VALUE) + { + this->nch = nch; + this->bps = bps; + encoder = FLAC__stream_encoder_new(); + + if (!encoder) + return; + + // set stream info + if (!FLAC__stream_encoder_set_channels(encoder, nch) + || !FLAC__stream_encoder_set_bits_per_sample(encoder, bps) + || !FLAC__stream_encoder_set_sample_rate(encoder, samplerate) + || !FLAC__stream_encoder_set_total_samples_estimate(encoder, 0) + || !FLAC__stream_encoder_set_compression_level(encoder, compression) + || !FLAC__stream_encoder_set_blocksize(encoder, 0)) + { + FLAC__stream_encoder_delete(encoder); + encoder=0; + return; + } + // TODO: set any more config stuff + + // TODO: seektable? + //FLAC__StreamMetadata *seektable = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE); + + padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING); + if (padding) + { + padding->length = 16384; // TODO: configurable padding size + if (!FLAC__stream_encoder_set_metadata(encoder, &padding, 1)) + { + FLAC__stream_encoder_delete(encoder); + encoder=0; + return; + } + } + + if (FLAC__stream_encoder_init_stream(encoder, Win32_Write, Win32_Seek, Win32_Tell, NULL, &win32State) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) + { + FLAC__stream_encoder_delete(encoder); + encoder=0; + return; + } + } +} + +bool AudioCoderFlac::OK() +{ + if (!encoder) + return false; + + return FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK; +} + +AudioCoderFlac::~AudioCoderFlac() +{ + if (encoder) + FLAC__stream_encoder_delete(encoder); + + if (padding) + FLAC__metadata_object_delete(padding); + + if (win32State.handle != INVALID_HANDLE_VALUE) + CloseHandle(win32State.handle); + +} + +static void Copy8(FLAC__int32 *buffer, void *inputData, int numSamples) +{ + uint8_t *in = (uint8_t *)inputData; + + for (int i=0;i<numSamples;i++) + { + buffer[i] = (FLAC__int32)in[i]; + } +} + +static void Copy16(FLAC__int32 *buffer, void *inputData, int numSamples) +{ + int16_t *in = (int16_t *)inputData; + + for (int i=0;i<numSamples;i++) + { + buffer[i] = (FLAC__int32)in[i]; + } +} + +static void Copy24(FLAC__int32 *buffer, void *inputData, int numSamples) +{ + uint8_t *in = (uint8_t *)inputData; + + for (int i=0;i<numSamples;i++) + { + FLAC__int32 val = (((FLAC__int32)in[0]) << 0); + val = val | (((FLAC__int32)in[1]) << 8); + val = val | (((FLAC__int32)in[2]) << 16); + + buffer[i] = (FLAC__int32)val; + in+=3; + } +} + +static void Copy32(FLAC__int32 *buffer, void *inputData, int numSamples) +{ + int32_t *in = (int32_t *)inputData; + + for (int i=0;i<numSamples;i++) + { + buffer[i] = (FLAC__int32)in[i]; + } +} + +int AudioCoderFlac::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + FLAC__int32 buffer[65536]; + + + FLAC__uint64 startBytes = win32State.bytesWritten; + + if (!in_avail) + { + if (finished) + { + int ret = (int)finishedBytes; + finishedBytes = 0; + return ret; + } + return 0; + } + + + int numSamples = in_avail/(bps/8); + + if (numSamples>65536) + numSamples = 65536; + + switch (bps) + { + case 8: + Copy8(buffer, in, numSamples); + break; + case 16: + Copy16(buffer, in, numSamples); + break; + case 24: + Copy24(buffer, in, numSamples); + break; + case 32: + Copy32(buffer, in, numSamples); + break; + } + + FLAC__bool result = FLAC__stream_encoder_process_interleaved(encoder, buffer, numSamples/nch); + + if (result) + { + *in_used = numSamples*(bps/8); + return (int)(win32State.bytesWritten - startBytes); + } + + return 0; +} + +void AudioCoderFlac::PrepareToFinish() +{ + FLAC__uint64 startBytes = win32State.bytesWritten; + FLAC__stream_encoder_finish(encoder); + finishedBytes = win32State.bytesWritten - startBytes; +} + +void AudioCoderFlac::Finish(const wchar_t *destination) +{ + if (win32State.handle != INVALID_HANDLE_VALUE) + CloseHandle(win32State.handle); + + win32State.handle = INVALID_HANDLE_VALUE; + if (!MoveFile(tempFile, destination)) + { + if (CopyFile(tempFile, destination, FALSE)) + DeleteFile(tempFile); + } +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.h b/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.h new file mode 100644 index 00000000..e28eba96 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/AudioCoderFlac.h @@ -0,0 +1,29 @@ +#pragma once +#include "../nsv/enc_if.h" +#include <FLAC/stream_encoder.h> +#include "StreamFileWin32.h" + +typedef struct { + unsigned int compression; // 0-8 +} configtype; + +class AudioCoderFlac : public AudioCoder +{ +public: + AudioCoderFlac(unsigned int nch, unsigned int bps, unsigned int samplerate, unsigned int compression); + ~AudioCoderFlac(); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); //returns bytes in out + void PrepareToFinish(); + void Finish(const wchar_t *destination); + bool OK(); + +private: + FLAC__StreamEncoder *encoder; + FLAC__StreamMetadata *padding; + Win32_State win32State; + unsigned int nch; + unsigned int bps; + wchar_t tempFile[MAX_PATH]; + bool finished; + FLAC__uint64 finishedBytes; +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_flac/StreamFileWin32.cpp b/Src/Plugins/Encoder/enc_flac/StreamFileWin32.cpp new file mode 100644 index 00000000..04c152dd --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/StreamFileWin32.cpp @@ -0,0 +1,69 @@ +#include "StreamFileWin32.h" +#include <assert.h> + +static __int64 Seek64(HANDLE hf, __int64 distance, DWORD MoveMethod) +{ + LARGE_INTEGER li; + + li.QuadPart = distance; + + li.LowPart = SetFilePointer (hf, li.LowPart, &li.HighPart, MoveMethod); + + if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) + { + li.QuadPart = -1; + } + + return li.QuadPart; +} + + +FLAC__StreamEncoderWriteStatus Win32_Write(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) +{ + assert(bytes <= 4294967295U); + + HANDLE file = ((Win32_State *)client_data)->handle; + if(bytes > 0) + { + assert(sizeof(FLAC__byte) == 1); + DWORD bytesWritten = 0, bytesToWrite = (DWORD)bytes; + BOOL result = WriteFile(file, buffer, bytesToWrite, &bytesWritten, NULL); + ((Win32_State *)client_data)->bytesWritten += bytesWritten; + + if (!result) + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; + } + else + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; +} + +FLAC__StreamEncoderSeekStatus Win32_Seek(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + HANDLE file = ((Win32_State *)client_data)->handle; + + __int64 result = Seek64(file, absolute_byte_offset, FILE_BEGIN); + + if (result == INVALID_SET_FILE_POINTER) + return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + else + { + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; + } +} + +FLAC__StreamEncoderTellStatus Win32_Tell(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + HANDLE file = ((Win32_State *)client_data)->handle; + + __int64 position = Seek64(file, 0, FILE_CURRENT); + + if (position == INVALID_SET_FILE_POINTER) + return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + else + { + *absolute_byte_offset=position; + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + } +} + diff --git a/Src/Plugins/Encoder/enc_flac/StreamFileWin32.h b/Src/Plugins/Encoder/enc_flac/StreamFileWin32.h new file mode 100644 index 00000000..6c09bc46 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/StreamFileWin32.h @@ -0,0 +1,18 @@ +#pragma once + +#include <FLAC/all.h> +#include <windows.h> + +struct Win32_State +{ +public: + HANDLE handle; + FLAC__uint64 bytesWritten; +}; + +FLAC__StreamEncoderWriteStatus Win32_Write(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); +FLAC__StreamEncoderSeekStatus Win32_Seek(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); +FLAC__StreamEncoderTellStatus Win32_Tell(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +void Progress(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); + + diff --git a/Src/Plugins/Encoder/enc_flac/api__enc_flac.h b/Src/Plugins/Encoder/enc_flac/api__enc_flac.h new file mode 100644 index 00000000..2b62bfb4 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/api__enc_flac.h @@ -0,0 +1,10 @@ +#ifndef NULLSOFT_ENC_FLAC_API_H +#define NULLSOFT_ENC_FLAC_API_H + +#include "api/service/api_service.h" +#include "../Agave/Language/api_language.h" + +#include "api/application/api_application.h" +#define WASABI_API_APP application + +#endif // !NULLSOFT_ENC_FLAC_API_H diff --git a/Src/Plugins/Encoder/enc_flac/enc_flac2.rc b/Src/Plugins/Encoder/enc_flac/enc_flac2.rc new file mode 100644 index 00000000..adb678f3 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/enc_flac2.rc @@ -0,0 +1,119 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONFIG DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "FLAC Encoder Options",IDC_STATIC,0,0,256,166 + LTEXT "Compression factor:",IDC_STATIC,7,13,66,8 + CONTROL "",IDC_COMPRESSIONSLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOOLTIPS | WS_TABSTOP,5,23,243,17 + LTEXT "Fast Encoding",IDC_STATIC,9,43,46,8 + LTEXT "Best Compression",IDC_STATIC,191,43,58,8 + LTEXT "FLAC is the Free Lossless Audio Codec, ",IDC_STATIC,5,143,128,8 + CONTROL "http://flac.sf.net/",IDC_URL,"Button",BS_OWNERDRAW | WS_TABSTOP,131,142,62,9 + LTEXT "",IDC_STATIC_FLAC_VER,5,151,242,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_CONFIG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 83 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_LIBFLAC_DLL_MISSING "[libflac.dll missing]" + IDS_ENC_FLAC_DESC "FLAC Encoder v%s (libFLAC v%s)" +END + +STRINGTABLE +BEGIN + 65535 "{73760073-560C-433b-BC59-3FCC94CDEA4A}" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_flac/enc_flac2.sln b/Src/Plugins/Encoder/enc_flac/enc_flac2.sln new file mode 100644 index 00000000..fd840cc5 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/enc_flac2.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_flac", "enc_flac2.vcxproj", "{922008CC-4A0E-4EA1-92F2-AA822965BDF6}" + ProjectSection(ProjectDependencies) = postProject + {4FC28B55-2A14-43D5-86F7-201054F338A9} = {4FC28B55-2A14-43D5-86F7-201054F338A9} + {4CEFBC83-C215-11DB-8314-0800200C9A66} = {4CEFBC83-C215-11DB-8314-0800200C9A66} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libFLAC_dynamic", "..\libFLAC\libFLAC_dynamic.vcxproj", "{4CEFBC83-C215-11DB-8314-0800200C9A66}" + ProjectSection(ProjectDependencies) = postProject + {4FC28B55-2A14-43D5-86F7-201054F338A9} = {4FC28B55-2A14-43D5-86F7-201054F338A9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "..\libogg\libogg.vcxproj", "{4FC28B55-2A14-43D5-86F7-201054F338A9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Debug|Win32.ActiveCfg = Debug|Win32 + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Debug|Win32.Build.0 = Debug|Win32 + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Debug|x64.ActiveCfg = Debug|x64 + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Release|Win32.ActiveCfg = Release|Win32 + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Release|Win32.Build.0 = Release|Win32 + {922008CC-4A0E-4EA1-92F2-AA822965BDF6}.Release|x64.ActiveCfg = Release|x64 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Debug|x64.Build.0 = Debug|x64 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Release|Win32.Build.0 = Release|Win32 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Release|x64.ActiveCfg = Release|x64 + {4CEFBC83-C215-11DB-8314-0800200C9A66}.Release|x64.Build.0 = Release|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.Build.0 = Debug|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.ActiveCfg = Debug|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.Build.0 = Debug|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.ActiveCfg = Release|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.Build.0 = Release|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.ActiveCfg = Release|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A0F24E75-21BB-4DDF-A287-A481B554B4EB} + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj b/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj new file mode 100644 index 00000000..b937baea --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>enc_flac</ProjectName> + <ProjectGuid>{922008CC-4A0E-4EA1-92F2-AA822965BDF6}</ProjectGuid> + <RootNamespace>enc_flac</RootNamespace> + <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Label="Vcpkg"> + <VcpkgEnableManifest>false</VcpkgEnableManifest> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ENC_FLAC2_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;ENC_FLAC2_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ENC_FLAC2_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;ENC_FLAC2_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="api__enc_flac.h" /> + <ClInclude Include="AudioCoderFlac.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StreamFileWin32.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="AudioCoderFlac.cpp" /> + <ClCompile Include="main.cpp" /> + <ClCompile Include="StreamFileWin32.cpp" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_flac2.rc" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj"> + <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj.filters b/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj.filters new file mode 100644 index 00000000..41b6f1a1 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/enc_flac2.vcxproj.filters @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="AudioCoderFlac.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="main.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="StreamFileWin32.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="StreamFileWin32.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="AudioCoderFlac.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="api__enc_flac.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{c641c9a9-b7d5-4744-bd44-2edc534f2425}</UniqueIdentifier> + </Filter> + <Filter Include="Ressource Files"> + <UniqueIdentifier>{63979e7c-4d4b-4fc2-89c6-3f476c40adfe}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{cc58b311-a8ed-4e0e-852b-cc82f0d2a83e}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_flac2.rc"> + <Filter>Ressource Files</Filter> + </ResourceCompile> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_flac/main.cpp b/Src/Plugins/Encoder/enc_flac/main.cpp new file mode 100644 index 00000000..d0507c59 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/main.cpp @@ -0,0 +1,320 @@ +#include "api__enc_flac.h" +#include "../Winamp/wa_ipc.h" +#include "../nsv/enc_if.h" +#include "../nu/AutoWideFn.h" +#include "AudioCoderFlac.h" +#include "resource.h" +#include <commctrl.h> +#include <windows.h> +#include <Uxtheme.h> +#include <api/service/waservicefactory.h> +#include <api/application/api_application.h> +#include <mmsystem.h> +#include <strsafe.h> + +#define ENC_VERSION "2.46" + +HWND winampwnd = 0; +int isthemethere = 0; +api_service *WASABI_API_SVC = 0; +api_language *WASABI_API_LNG = 0; +api_application *WASABI_API_APP = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; + +typedef struct +{ + configtype cfg; + char configfile[MAX_PATH]; +} +configwndrec; + +void readconfig(const char *configfile, configtype *cfg) +{ + if (configfile) + { + cfg->compression = GetPrivateProfileIntA("audio_flac", "compression", 5, configfile); + } + else + { + cfg->compression = 5; + } +} + +void writeconfig(const char *configfile, configtype *cfg) +{ + if (configfile) + { + char str[64] = {0}; + StringCchPrintfA(str, 64, "%u", cfg->compression); + WritePrivateProfileStringA("audio_flac", "compression", str, configfile); + } +} + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if(!WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if(!WASABI_API_APP) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid); + if (sf) WASABI_API_APP = reinterpret_cast<api_application*>(sf->getInterface()); + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncFlacLangGUID); + } +} + +static const char *GetFLACVersion() +{ + return "1.4.2"; +} + +static HCURSOR link_hand_cursor; +LRESULT link_handlecursor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LRESULT ret = CallWindowProcW((WNDPROC)GetPropW(hwndDlg, L"link_proc"), hwndDlg, uMsg, wParam, lParam); + // override the normal cursor behaviour so we have a hand to show it is a link + if(uMsg == WM_SETCURSOR) + { + if((HWND)wParam == hwndDlg) + { + if(!link_hand_cursor) + { + link_hand_cursor = LoadCursor(NULL, IDC_HAND); + } + SetCursor(link_hand_cursor); + return TRUE; + } + } + return ret; +} + +void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg == WM_DRAWITEM) + { + DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam; + if (di->CtlType == ODT_BUTTON) + { + wchar_t wt[123] = {0}; + int y; + RECT r; + HPEN hPen, hOldPen; + GetDlgItemTextW(hwndDlg, (int)wParam, wt, sizeof(wt)/sizeof(wt[0])); + + // due to the fun of theming and owner drawing we have to get the background colour + if(isthemethere){ + HTHEME hTheme = OpenThemeData(hwndDlg, L"Tab"); + if (hTheme) { + DrawThemeParentBackground(di->hwndItem, di->hDC, &di->rcItem); + CloseThemeData(hTheme); + } + } + + // draw text + SetTextColor(di->hDC, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + r = di->rcItem; + r.left += 2; + DrawTextW(di->hDC, wt, -1, &r, DT_VCENTER | DT_SINGLELINE); + + memset(&r, 0, sizeof(r)); + DrawTextW(di->hDC, wt, -1, &r, DT_SINGLELINE | DT_CALCRECT); + + // draw underline + y = di->rcItem.bottom - ((di->rcItem.bottom - di->rcItem.top) - (r.bottom - r.top)) / 2 - 1; + hPen = CreatePen(PS_SOLID, 0, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + hOldPen = (HPEN) SelectObject(di->hDC, hPen); + MoveToEx(di->hDC, di->rcItem.left + 2, y, NULL); + LineTo(di->hDC, di->rcItem.right + 2 - ((di->rcItem.right - di->rcItem.left) - (r.right - r.left)), y); + SelectObject(di->hDC, hOldPen); + DeleteObject(hPen); + } + } +} + +void link_startsubclass(HWND hwndDlg, UINT id) +{ +HWND ctrl = GetDlgItem(hwndDlg, id); + if(!GetPropW(ctrl, L"link_proc")) + { + SetPropW(ctrl, L"link_proc", + (HANDLE)SetWindowLongPtrW(ctrl, GWLP_WNDPROC, (LONG_PTR)link_handlecursor)); + } +} + +BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + static configwndrec *wr; + switch(uMsg) + { + case WM_INITDIALOG: + { + wr = (configwndrec *)lParam; + SendMessage(GetDlgItem(hwndDlg,IDC_COMPRESSIONSLIDER),TBM_SETRANGE,TRUE,MAKELONG(0,8)); + SendMessage(GetDlgItem(hwndDlg,IDC_COMPRESSIONSLIDER),TBM_SETPOS,TRUE,wr->cfg.compression); + const char *libFlacVer = GetFLACVersion(); + if (libFlacVer && *libFlacVer) + { + char flac_string[1024] = {0}; + StringCchPrintfA(flac_string, 1024, "libFLAC v%s",libFlacVer); + SetDlgItemTextA(hwndDlg, IDC_STATIC_FLAC_VER, flac_string); + } + link_startsubclass(hwndDlg, IDC_URL); + } + break; + + case WM_COMMAND: + if(LOWORD(wParam) == IDC_URL) + { + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://flac.sf.net/", IPC_OPEN_URL); + } + break; + + case WM_NOTIFY: + if(wParam == IDC_COMPRESSIONSLIDER) + { + LPNMHDR l = (LPNMHDR)lParam; + if(l->idFrom == IDC_COMPRESSIONSLIDER) + wr->cfg.compression = (unsigned int)SendMessage(GetDlgItem(hwndDlg,IDC_COMPRESSIONSLIDER),TBM_GETPOS,0,0); + } + break; + + case WM_DESTROY: + writeconfig(wr->configfile,&wr->cfg); + free(wr); wr=NULL; + break; + } + + const int controls[] = + { + IDC_COMPRESSIONSLIDER, + }; + if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE(controls))) + { + return TRUE; + } + + link_handledraw(hwndDlg,uMsg,wParam,lParam); + return 0; +} + +extern "C" +{ + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + if (idx == 0) + { + GetLocalisationApiService(); + const char *libFlacVer = GetFLACVersion(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDS_ENC_FLAC_DESC), ENC_VERSION, libFlacVer); + return mmioFOURCC('F', 'L', 'A', 'C'); + } + return 0; + } + + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (srct == mmioFOURCC('P', 'C', 'M', ' ') && *outt == mmioFOURCC('F', 'L', 'A', 'C')) + { + configtype cfg; + readconfig(configfile, &cfg); + *outt = mmioFOURCC('F', 'L', 'A', 'C'); + AudioCoderFlac *t=new AudioCoderFlac(nch, bps, srate, cfg.compression); + if (!t->OK()) + { + delete t; + return NULL; + } + return t; + } + return NULL; + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + ((AudioCoderFlac*)coder)->Finish(AutoWideFn(filename)); + } + + void __declspec(dllexport) FinishAudio3W(const wchar_t *filename, AudioCoder *coder) + { + ((AudioCoderFlac*)coder)->Finish(filename); + } + + void __declspec(dllexport) PrepareToFinish(const char *filename, AudioCoder *coder) + { + ((AudioCoderFlac*)coder)->PrepareToFinish(); + } + + void __declspec(dllexport) PrepareToFinishW(const wchar_t *filename, AudioCoder *coder) + { + ((AudioCoderFlac*)coder)->PrepareToFinish(); + } + + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, char *configfile) + { + if (outt == mmioFOURCC('F', 'L', 'A', 'C')) + { + configwndrec *wr = (configwndrec*)malloc(sizeof(configwndrec)); + if (configfile) StringCchCopyA(wr->configfile, MAX_PATH, configfile); + else wr->configfile[0] = 0; + readconfig(configfile, &wr->cfg); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_CONFIG, hwndParent, DlgProc, (LPARAM)wr); + } + return NULL; + } + + int __declspec(dllexport) SetConfigItem(unsigned int outt, char *item, char *data, char *configfile) + { + // nothing yet + return 0; + } + + int __declspec(dllexport) GetConfigItem(unsigned int outt, char *item, char *data, int len, char *configfile) + { + if (outt == mmioFOURCC('F', 'L', 'A', 'C')) + { + /* + configtype cfg; + readconfig(configfile, &cfg); + */ + if (!_stricmp(item, "bitrate")) StringCchCopyA(data, len, "755"); // FUCKO: this is ment to be an estimate for approximations of output filesize (used by ml_pmp). Improve this. + else if (!_stricmp(item,"extension")) StringCchCopyA(data, len, "flac"); + return 1; + } + return 0; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + isthemethere = !SendMessage(hwnd,WM_WA_IPC,IPC_ISWINTHEMEPRESENT,IPC_USE_UXTHEME_FUNC); + } +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_flac/resource.h b/Src/Plugins/Encoder/enc_flac/resource.h new file mode 100644 index 00000000..6d233f22 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/resource.h @@ -0,0 +1,24 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by enc_flac2.rc +// +#define IDD_CONFIG 9 +#define IDS_LIBFLAC_DLL_MISSING 102 +#define IDS_STRING103 103 +#define IDS_ENC_FLAC_DESC 103 +#define IDC_SLIDER1 1001 +#define IDC_COMPRESSIONSLIDER 1001 +#define IDC_STATIC_FLAC_VER 1002 +#define IDC_BUTTON1 1003 +#define IDC_URL 1003 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1004 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_flac/version.rc2 b/Src/Plugins/Encoder/enc_flac/version.rc2 new file mode 100644 index 00000000..6bc10f30 --- /dev/null +++ b/Src/Plugins/Encoder/enc_flac/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 2,46,0,0 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "2,46,0,0" + VALUE "InternalName", "Nullsoft FLAC Encoder" + VALUE "LegalCopyright", "Copyright © 2006-2023 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_flac.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_lame/24bit.cpp b/Src/Plugins/Encoder/enc_lame/24bit.cpp new file mode 100644 index 00000000..d1b83b1f --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/24bit.cpp @@ -0,0 +1,147 @@ +#include "MP3Coder.h" +#include <malloc.h> + +static const float const_1_div_128_ = 32768.0 / 128.0; /* 8 bit multiplier */ +static const double const_1_div_2147483648_ = 32768.0 / 2147483648.0; /* 32 bit multiplier */ + +static void Int8_To_Float32(float *dest, void *sourceBuffer, signed int sourceStride, unsigned int count) +{ + signed char *src = (signed char*)sourceBuffer; + + while( count-- ) + { + float samp = *src * const_1_div_128_; + *dest = samp; + + src += sourceStride; + dest ++; + } +} + +static void Int24_To_Float32(float *dest, void *sourceBuffer, signed int sourceStride, unsigned int count) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + + while ( count-- ) + { + signed long temp = (((long)src[0]) << 8); + temp = temp | (((long)src[1]) << 16); + temp = temp | (((long)src[2]) << 24); + *dest = (float) ((double)temp * const_1_div_2147483648_); + src += sourceStride * 3; + dest ++; + } +} + +int AudioCoderMP3_24::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (m_err) return -1; + if (!hbeStream) + { + if (beInitStream(&beConfig, &ibuf_size_spls, &obuf_size, (PHBE_STREAM) &hbeStream) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + ibuf_size = ibuf_size_spls * bytesPerSample; + + if (is_downmix) ibuf_size *= 2; + + bs = (char*)malloc(ibuf_size); + bs_size = 0; + } + + *in_used = 0; + + int needbytes = ibuf_size - bs_size; + if (needbytes > 0 && in_avail > 0) + { + if (needbytes > in_avail) + needbytes = in_avail; + memcpy(bs + bs_size, in, needbytes); + bs_size += needbytes; + *in_used = needbytes; + } + + if (!done) + { + if (bs_size < (int)ibuf_size) return 0; + } + + if (out_avail < (int)obuf_size) return 0; + + int feedBytes = min(bs_size, (int)ibuf_size); + int feedSamples = feedBytes / bytesPerSample; + bs_size -= feedBytes; + /* + if (is_downmix) + { + int x; + int l = feedBytes / 4; + short *b = (short*)bs; + for (x = 0; x < l; x ++) + { + b[x] = b[x * 2] / 2 + b[x * 2 + 1] / 2; + } + } + */ + DWORD dwo = 0; + + if (feedSamples) + { + if (mono_input) + { + float *float_l = (float *)alloca(sizeof(float) * feedSamples); + switch(bytesPerSample) + { + case 8: + Int8_To_Float32(float_l, bs, 1, feedSamples); + break; + case 24: + Int24_To_Float32(float_l, bs, 1, feedSamples); + break; + } + + + if (beEncodeChunkFloatS16NI(hbeStream, feedSamples, float_l, float_l, (unsigned char *)out, &dwo) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + } + else + { + float *float_l = (float *)alloca(sizeof(float) * feedSamples / 2); + float *float_r = (float *)alloca(sizeof(float) * feedSamples / 2); + switch(bytesPerSample) + { + case 1: // 8 bit + Int8_To_Float32(float_l, bs, 2, feedSamples / 2); + Int8_To_Float32(float_r, bs + 1, 2, feedSamples / 2); + break; + case 3: // 24 bit + Int24_To_Float32(float_l, bs, 2, feedSamples / 2); + Int24_To_Float32(float_r, bs + 3, 2, feedSamples / 2); + break; + } + + if (beEncodeChunkFloatS16NI(hbeStream, feedSamples / 2, float_l, float_r, (unsigned char *)out, &dwo) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + } + } + + if (!dwo && done == 1) + { + if (beDeinitStream(hbeStream, (unsigned char *)out, &dwo) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + done++; + } + + return dwo; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.c b/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.c new file mode 100644 index 00000000..e982cad2 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.c @@ -0,0 +1,1028 @@ +/* +* Blade DLL Interface for LAME. +* +* Copyright (c) 1999 - 2002 A.L. Faber +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +*/ + +#include <windows.h> +#include <Windef.h> +#include "BladeMP3EncDLL.h" +#include <assert.h> +#include <stdio.h> + +#include <lame/lame.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define Min(A, B) ((A) < (B) ? (A) : (B)) +#define Max(A, B) ((A) > (B) ? (A) : (B)) + +#define _RELEASEDEBUG 0 + + // lame_enc DLL version number + const BYTE MAJORVERSION = 1; + const BYTE MINORVERSION = 32; + + + // Local variables + static DWORD dwSampleBufferSize = 0; + static HMODULE gs_hModule = NULL; + static BOOL gs_bLogFile = FALSE; + static lame_global_flags* gfp_save = NULL; + + // Local function prototypes + static void dump_config(lame_global_flags* gfp); + static void DebugPrintf(const char* pzFormat, ...); + static void DispErr(wchar_t const* strErr); + static void PresetOptions(lame_global_flags* gfp, LONG myPreset); + + + static void DebugPrintf(const char* pzFormat, ...) + { + char szBuffer[1024] = { '\0', }; + char szFileName[MAX_PATH + 1] = { '\0', }; + va_list ap; + + // Get the full module (DLL) file name + GetModuleFileNameA(gs_hModule, + szFileName, + sizeof(szFileName)); + + // change file name extention + szFileName[strlen(szFileName) - 3] = 't'; + szFileName[strlen(szFileName) - 2] = 'x'; + szFileName[strlen(szFileName) - 1] = 't'; + + // start at beginning of the list + va_start(ap, pzFormat); + + // copy it to the string buffer + _vsnprintf(szBuffer, sizeof(szBuffer), pzFormat, ap); + + // log it to the file? + if (gs_bLogFile) + { + FILE* fp = NULL; + + // try to open the log file + fp = fopen(szFileName, "a+"); + + // check file open result + if (fp) + { + // write string to the file + fputs(szBuffer, fp); + + // close the file + fclose(fp); + } + } + +#if defined _DEBUG || defined _RELEASEDEBUG + OutputDebugStringA(szBuffer); +#endif + + va_end(ap); + } + + + static void PresetOptions(lame_global_flags* gfp, LONG myPreset) + { + switch (myPreset) + { + /*-1*/case LQP_NOPRESET: + break; + + /*0*/case LQP_NORMAL_QUALITY: + /* lame_set_quality( gfp, 5 );*/ + break; + + /*1*/case LQP_LOW_QUALITY: + lame_set_quality(gfp, 9); + break; + + /*2*/case LQP_HIGH_QUALITY: + lame_set_quality(gfp, 2); + break; + + /*3*/case LQP_VOICE_QUALITY: // --voice flag for experimental voice mode + lame_set_mode(gfp, MONO); + lame_set_preset(gfp, 56); + break; + + /*4*/case LQP_R3MIX: // --R3MIX + lame_set_preset(gfp, R3MIX); + break; + + /*5*/case LQP_VERYHIGH_QUALITY: + lame_set_quality(gfp, 0); + break; + + /*6*/case LQP_STANDARD: // --PRESET STANDARD + lame_set_preset(gfp, STANDARD); + break; + + /*7*/case LQP_FAST_STANDARD: // --PRESET FAST STANDARD + lame_set_preset(gfp, STANDARD_FAST); + break; + + /*8*/case LQP_EXTREME: // --PRESET EXTREME + lame_set_preset(gfp, EXTREME); + break; + + /*9*/case LQP_FAST_EXTREME: // --PRESET FAST EXTREME: + lame_set_preset(gfp, EXTREME_FAST); + break; + + /*10*/case LQP_INSANE: // --PRESET INSANE + lame_set_preset(gfp, INSANE); + break; + + /*11*/case LQP_ABR: // --PRESET ABR + // handled in beInitStream + break; + + /*12*/case LQP_CBR: // --PRESET CBR + // handled in beInitStream + break; + + /*13*/case LQP_MEDIUM: // --PRESET MEDIUM + lame_set_preset(gfp, MEDIUM); + break; + + /*14*/case LQP_FAST_MEDIUM: // --PRESET FAST MEDIUM + lame_set_preset(gfp, MEDIUM_FAST); + break; + + /*1000*/case LQP_PHONE: + lame_set_mode(gfp, MONO); + lame_set_preset(gfp, 16); + break; + + /*2000*/case LQP_SW: + lame_set_mode(gfp, MONO); + lame_set_preset(gfp, 24); + break; + + /*3000*/case LQP_AM: + lame_set_mode(gfp, MONO); + lame_set_preset(gfp, 40); + break; + + /*4000*/case LQP_FM: + lame_set_preset(gfp, 112); + break; + + /*5000*/case LQP_VOICE: + lame_set_mode(gfp, MONO); + lame_set_preset(gfp, 56); + break; + + /*6000*/case LQP_RADIO: + lame_set_preset(gfp, 112); + break; + + /*7000*/case LQP_TAPE: + lame_set_preset(gfp, 112); + break; + + /*8000*/case LQP_HIFI: + lame_set_preset(gfp, 160); + break; + + /*9000*/case LQP_CD: + lame_set_preset(gfp, 192); + break; + + /*10000*/case LQP_STUDIO: + lame_set_preset(gfp, 256); + break; + + } + } + + + __declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream) + { + int actual_bitrate; + //2001-12-18 + BE_CONFIG lameConfig = { 0, }; + int nInitReturn = 0; + lame_global_flags* gfp = NULL; + + // Init the global flags structure + gfp = lame_init(); + *phbeStream = (HBE_STREAM)gfp; + + // clear out structure + memset(&lameConfig, 0x00, CURRENT_STRUCT_SIZE); + + // Check if this is a regular BLADE_ENCODER header + if (pbeConfig->dwConfig != BE_CONFIG_LAME) + { + int nCRC = pbeConfig->format.mp3.bCRC; + int nVBR = (nCRC >> 12) & 0x0F; + + // Copy parameter from old Blade structure + lameConfig.format.LHV1.dwSampleRate = pbeConfig->format.mp3.dwSampleRate; + //for low bitrates, LAME will automatically downsample for better + //sound quality. Forcing output samplerate = input samplerate is not a good idea + //unless the user specifically requests it: + //lameConfig.format.LHV1.dwReSampleRate=pbeConfig->format.mp3.dwSampleRate; + lameConfig.format.LHV1.nMode = (pbeConfig->format.mp3.byMode & 0x0F); + lameConfig.format.LHV1.dwBitrate = pbeConfig->format.mp3.wBitrate; + lameConfig.format.LHV1.bPrivate = pbeConfig->format.mp3.bPrivate; + lameConfig.format.LHV1.bOriginal = pbeConfig->format.mp3.bOriginal; + lameConfig.format.LHV1.bCRC = nCRC & 0x01; + lameConfig.format.LHV1.bCopyright = pbeConfig->format.mp3.bCopyright; + + // Fill out the unknowns + lameConfig.format.LHV1.dwStructSize = CURRENT_STRUCT_SIZE; + lameConfig.format.LHV1.dwStructVersion = CURRENT_STRUCT_VERSION; + + // Get VBR setting from fourth nibble + if (nVBR > 0) + { + lameConfig.format.LHV1.bWriteVBRHeader = TRUE; + lameConfig.format.LHV1.bEnableVBR = TRUE; + lameConfig.format.LHV1.nVBRQuality = nVBR - 1; + } + + // Get Quality from third nibble + lameConfig.format.LHV1.nPreset = ((nCRC >> 8) & 0x0F); + + } + else + { + // Copy the parameters + memcpy(&lameConfig, pbeConfig, pbeConfig->format.LHV1.dwStructSize); + } + + // --------------- Set arguments to LAME encoder ------------------------- + + // Set input sample frequency + lame_set_in_samplerate(gfp, lameConfig.format.LHV1.dwSampleRate); + + // disable INFO/VBR tag by default. + // if this tag is used, the calling program must call beWriteVBRTag() + // after encoding. But the original DLL documentation does not + // require the + // app to call beWriteVBRTag() unless they have specifically + // set LHV1.bWriteVBRHeader=TRUE. Thus the default setting should + // be disabled. + lame_set_bWriteVbrTag(gfp, 0); + + //2001-12-18 Dibrom's ABR preset stuff + + if (lameConfig.format.LHV1.nPreset == LQP_ABR) // --ALT-PRESET ABR + { + actual_bitrate = lameConfig.format.LHV1.dwVbrAbr_bps / 1000; + + // limit range + if (actual_bitrate > 320) + { + actual_bitrate = 320; + } + + if (actual_bitrate < 8) + { + actual_bitrate = 8; + } + + lame_set_preset(gfp, actual_bitrate); + } + + // end Dibrom's ABR preset 2001-12-18 ****** START OF CBR + + if (lameConfig.format.LHV1.nPreset == LQP_CBR) // --ALT-PRESET CBR + { + actual_bitrate = lameConfig.format.LHV1.dwBitrate; + lame_set_preset(gfp, actual_bitrate); + lame_set_VBR(gfp, vbr_off); + } + + // end Dibrom's CBR preset 2001-12-18 + + // The following settings only used when preset is not one of the LAME QUALITY Presets + if ((int)lameConfig.format.LHV1.nPreset < (int)LQP_STANDARD) + { + switch (lameConfig.format.LHV1.nMode) + { + case BE_MP3_MODE_STEREO: + lame_set_mode(gfp, STEREO); + lame_set_num_channels(gfp, 2); + break; + case BE_MP3_MODE_JSTEREO: + lame_set_mode(gfp, JOINT_STEREO); + //lame_set_force_ms( gfp, bForceMS ); // no check box to force this? + lame_set_num_channels(gfp, 2); + break; + case BE_MP3_MODE_MONO: + lame_set_mode(gfp, MONO); + lame_set_num_channels(gfp, 1); + break; + case BE_MP3_MODE_DUALCHANNEL: + lame_set_mode(gfp, DUAL_CHANNEL); + lame_set_num_channels(gfp, 2); + break; + default: + { + DebugPrintf("Invalid lameConfig.format.LHV1.nMode, value is %d\n", lameConfig.format.LHV1.nMode); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + } + + if (lameConfig.format.LHV1.bEnableVBR) + { + /* set VBR quality */ + lame_set_VBR_q(gfp, lameConfig.format.LHV1.nVBRQuality); + + /* select proper VBR method */ + switch (lameConfig.format.LHV1.nVbrMethod) + { + case VBR_METHOD_NONE: + lame_set_VBR(gfp, vbr_off); + break; + + case VBR_METHOD_DEFAULT: + lame_set_VBR(gfp, vbr_default); + break; + + case VBR_METHOD_OLD: + lame_set_VBR(gfp, vbr_rh); + break; + + case VBR_METHOD_MTRH: + case VBR_METHOD_NEW: + /* + * the --vbr-mtrh commandline switch is obsolete. + * now --vbr-mtrh is known as --vbr-new + */ + lame_set_VBR(gfp, vbr_mtrh); + break; + + case VBR_METHOD_ABR: + lame_set_VBR(gfp, vbr_abr); + break; + + default: + /* unsupported VBR method */ + assert(FALSE); + } + } + else + { + /* use CBR encoding method, so turn off VBR */ + lame_set_VBR(gfp, vbr_off); + } + + /* Set bitrate. (CDex users always specify bitrate=Min bitrate when using VBR) */ + lame_set_brate(gfp, lameConfig.format.LHV1.dwBitrate); + + /* check if we have to use ABR, in order to backwards compatible, this + * condition should still be checked indepedent of the nVbrMethod method + */ + if (lameConfig.format.LHV1.dwVbrAbr_bps > 0) + { + /* set VBR method to ABR */ + lame_set_VBR(gfp, vbr_abr); + + /* calculate to kbps, round to nearest kbps */ + lame_set_VBR_mean_bitrate_kbps(gfp, (lameConfig.format.LHV1.dwVbrAbr_bps + 500) / 1000); + + /* limit range */ + if (lame_get_VBR_mean_bitrate_kbps(gfp) > 320) + { + lame_set_VBR_mean_bitrate_kbps(gfp, 320); + } + + if (lame_get_VBR_mean_bitrate_kbps(gfp) < 8) + { + lame_set_VBR_mean_bitrate_kbps(gfp, 8); + } + } + + } + + // First set all the preset options + if (LQP_NOPRESET != lameConfig.format.LHV1.nPreset) + { + PresetOptions(gfp, lameConfig.format.LHV1.nPreset); + } + + + // Set frequency resampling rate, if specified + if (lameConfig.format.LHV1.dwReSampleRate > 0) + { + lame_set_out_samplerate(gfp, lameConfig.format.LHV1.dwReSampleRate); + } + + + switch (lameConfig.format.LHV1.nMode) + { + case BE_MP3_MODE_MONO: + lame_set_mode(gfp, MONO); + lame_set_num_channels(gfp, 1); + break; + + default: + break; + } + + + // Use strict ISO encoding? + lame_set_strict_ISO(gfp, (lameConfig.format.LHV1.bStrictIso) ? 1 : 0); + + // Set copyright flag? + if (lameConfig.format.LHV1.bCopyright) + { + lame_set_copyright(gfp, 1); + } + + // Do we have to tag it as non original + if (!lameConfig.format.LHV1.bOriginal) + { + lame_set_original(gfp, 0); + } + else + { + lame_set_original(gfp, 1); + } + + // Add CRC? + if (lameConfig.format.LHV1.bCRC) + { + lame_set_error_protection(gfp, 1); + } + else + { + lame_set_error_protection(gfp, 0); + } + + // Set private bit? + if (lameConfig.format.LHV1.bPrivate) + { + lame_set_extension(gfp, 1); + } + else + { + lame_set_extension(gfp, 0); + } + + + // Set VBR min bitrate, if specified + if (lameConfig.format.LHV1.dwBitrate > 0) + { + lame_set_VBR_min_bitrate_kbps(gfp, lameConfig.format.LHV1.dwBitrate); + } + + // Set Maxbitrate, if specified + if (lameConfig.format.LHV1.dwMaxBitrate > 0) + { + lame_set_VBR_max_bitrate_kbps(gfp, lameConfig.format.LHV1.dwMaxBitrate); + } + // Set bit resovoir option + if (lameConfig.format.LHV1.bNoRes) + { + lame_set_disable_reservoir(gfp, 1); + } + + // check if the VBR tag is required + if (lameConfig.format.LHV1.bWriteVBRHeader) + { + lame_set_bWriteVbrTag(gfp, 1); + } + else + { + lame_set_bWriteVbrTag(gfp, 0); + } + + // Override Quality setting, use HIGHBYTE = NOT LOWBYTE to be backwards compatible + if ((lameConfig.format.LHV1.nQuality & 0xFF) == + ((~(lameConfig.format.LHV1.nQuality >> 8)) & 0xFF)) + { + lame_set_quality(gfp, lameConfig.format.LHV1.nQuality & 0xFF); + } + + if (0 != (nInitReturn = lame_init_params(gfp))) + { + return nInitReturn; + } + + //LAME encoding call will accept any number of samples. + if (0 == lame_get_version(gfp)) + { + // For MPEG-II, only 576 samples per frame per channel + *dwSamples = 576 * lame_get_num_channels(gfp); + } + else + { + // For MPEG-I, 1152 samples per frame per channel + *dwSamples = 1152 * lame_get_num_channels(gfp); + } + + // Set the input sample buffer size, so we know what we can expect + dwSampleBufferSize = *dwSamples; + + // Set MP3 buffer size, conservative estimate + *dwBufferSize = (DWORD)(1.25 * (*dwSamples / lame_get_num_channels(gfp)) + 7200); + + // For debugging purposes + dump_config(gfp); + + // Everything went OK, thus return SUCCESSFUL + return BE_ERR_SUCCESSFUL; + } + + + + __declspec(dllexport) BE_ERR beFlushNoGap(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput) + { + int nOutputSamples = 0; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + // Init the global flags structure + nOutputSamples = lame_encode_flush_nogap(gfp, pOutput, LAME_MAXMP3BUFFER); + + if (nOutputSamples < 0) + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; + } + + __declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput) + { + int nOutputSamples = 0; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + nOutputSamples = lame_encode_flush(gfp, pOutput, 0); + + if (nOutputSamples < 0) + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; + } + + + __declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream) + { + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + // lame will be close in VbrWriteTag function + if (!lame_get_bWriteVbrTag(gfp)) + { + // clean up of allocated memory + lame_close(gfp); + + gfp_save = NULL; + } + else + { + gfp_save = (lame_global_flags*)hbeStream; + } + + // DeInit encoder + return BE_ERR_SUCCESSFUL; + } + + + + __declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion) + { + // DLL Release date + char lpszDate[20] = { '\0', }; + char lpszTemp[5] = { '\0', }; + lame_version_t lv = { 0, }; + + + // Set DLL interface version + pbeVersion->byDLLMajorVersion = MAJORVERSION; + pbeVersion->byDLLMinorVersion = MINORVERSION; + + get_lame_version_numerical(&lv); + + // Set Engine version number (Same as Lame version) + pbeVersion->byMajorVersion = (BYTE)lv.major; + pbeVersion->byMinorVersion = (BYTE)lv.minor; + pbeVersion->byAlphaLevel = (BYTE)lv.alpha; + pbeVersion->byBetaLevel = (BYTE)lv.beta; + +#ifdef MMX_choose_table + pbeVersion->byMMXEnabled = 1; +#else + pbeVersion->byMMXEnabled = 0; +#endif + + memset(pbeVersion->btReserved, 0, sizeof(pbeVersion->btReserved)); + + // Get compilation date + strcpy(lpszDate, __DATE__); + + // Get the first three character, which is the month + strncpy(lpszTemp, lpszDate, 3); + lpszTemp[3] = '\0'; + pbeVersion->byMonth = 1; + + // Set month + if (strcmp(lpszTemp, "Jan") == 0) pbeVersion->byMonth = 1; + if (strcmp(lpszTemp, "Feb") == 0) pbeVersion->byMonth = 2; + if (strcmp(lpszTemp, "Mar") == 0) pbeVersion->byMonth = 3; + if (strcmp(lpszTemp, "Apr") == 0) pbeVersion->byMonth = 4; + if (strcmp(lpszTemp, "May") == 0) pbeVersion->byMonth = 5; + if (strcmp(lpszTemp, "Jun") == 0) pbeVersion->byMonth = 6; + if (strcmp(lpszTemp, "Jul") == 0) pbeVersion->byMonth = 7; + if (strcmp(lpszTemp, "Aug") == 0) pbeVersion->byMonth = 8; + if (strcmp(lpszTemp, "Sep") == 0) pbeVersion->byMonth = 9; + if (strcmp(lpszTemp, "Oct") == 0) pbeVersion->byMonth = 10; + if (strcmp(lpszTemp, "Nov") == 0) pbeVersion->byMonth = 11; + if (strcmp(lpszTemp, "Dec") == 0) pbeVersion->byMonth = 12; + + // Get day of month string (char [4..5]) + pbeVersion->byDay = (BYTE)atoi(lpszDate + 4); + + // Get year of compilation date (char [7..10]) + pbeVersion->wYear = (WORD)atoi(lpszDate + 7); + + memset(pbeVersion->zHomepage, 0x00, BE_MAX_HOMEPAGE); + + strcpy(pbeVersion->zHomepage, "http://www.mp3dev.org/"); + } + + __declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, + PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput) + { + // Encode it + int dwSamples; + int nOutputSamples = 0; + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + dwSamples = nSamples / lame_get_num_channels(gfp); + + // old versions of lame_enc.dll required exactly 1152 samples + // and worked even if nSamples accidently set to 2304 + // simulate this behavoir: + if (1 == lame_get_num_channels(gfp) && nSamples == 2304) + { + dwSamples /= 2; + } + + + if (1 == lame_get_num_channels(gfp)) + { + nOutputSamples = lame_encode_buffer(gfp, pSamples, pSamples, dwSamples, pOutput, 0); + } + else + { + nOutputSamples = lame_encode_buffer_interleaved(gfp, pSamples, dwSamples, pOutput, 0); + } + + + if (nOutputSamples < 0) + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = (DWORD)nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; + } + + + // accept floating point audio samples, scaled to the range of a signed 16-bit + // integer (within +/- 32768), in non-interleaved channels -- DSPguru, jd + __declspec(dllexport) BE_ERR beEncodeChunkFloatS16NI(HBE_STREAM hbeStream, DWORD nSamples, + PFLOAT buffer_l, PFLOAT buffer_r, PBYTE pOutput, PDWORD pdwOutput) + { + int nOutputSamples; + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + nOutputSamples = lame_encode_buffer_float(gfp, buffer_l, buffer_r, nSamples, pOutput, 0); + + if (nOutputSamples >= 0) + { + *pdwOutput = (DWORD)nOutputSamples; + } + else + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + + return BE_ERR_SUCCESSFUL; + } + + static int + maybeSyncWord(FILE* fpStream) + { + unsigned char mp3_frame_header[4]; + size_t nbytes = fread(mp3_frame_header, 1, sizeof(mp3_frame_header), fpStream); + if (nbytes != sizeof(mp3_frame_header)) { + return -1; + } + if (mp3_frame_header[0] != 0xffu) { + return -1; /* doesn't look like a sync word */ + } + if ((mp3_frame_header[1] & 0xE0u) != 0xE0u) { + return -1; /* doesn't look like a sync word */ + } + return 0; + } + + static int + skipId3v2(FILE* fpStream, size_t lametag_frame_size) + { + size_t nbytes; + size_t id3v2TagSize = 0; + unsigned char id3v2Header[10]; + + /* seek to the beginning of the stream */ + if (fseek(fpStream, 0, SEEK_SET) != 0) { + return -2; /* not seekable, abort */ + } + /* read 10 bytes in case there's an ID3 version 2 header here */ + nbytes = fread(id3v2Header, 1, sizeof(id3v2Header), fpStream); + if (nbytes != sizeof(id3v2Header)) { + return -3; /* not readable, maybe opened Write-Only */ + } + /* does the stream begin with the ID3 version 2 file identifier? */ + if (!strncmp((char*)id3v2Header, "ID3", 3)) { + /* the tag size (minus the 10-byte header) is encoded into four + * bytes where the most significant bit is clear in each byte + */ + id3v2TagSize = (((id3v2Header[6] & 0x7f) << 21) + | ((id3v2Header[7] & 0x7f) << 14) + | ((id3v2Header[8] & 0x7f) << 7) + | (id3v2Header[9] & 0x7f)) + + sizeof id3v2Header; + } + /* Seek to the beginning of the audio stream */ + if (fseek(fpStream, id3v2TagSize, SEEK_SET) != 0) { + return -2; + } + if (maybeSyncWord(fpStream) != 0) { + return -1; + } + if (fseek(fpStream, id3v2TagSize + lametag_frame_size, SEEK_SET) != 0) { + return -2; + } + if (maybeSyncWord(fpStream) != 0) { + return -1; + } + /* OK, it seems we found our LAME-Tag/Xing frame again */ + /* Seek to the beginning of the audio stream */ + if (fseek(fpStream, id3v2TagSize, SEEK_SET) != 0) { + return -2; + } + return 0; + } + + static BE_ERR + updateLameTagFrame(lame_global_flags* gfp, FILE* fpStream) + { + size_t n = lame_get_lametag_frame(gfp, 0, 0); /* ask for bufer size */ + + if (n > 0) + { + unsigned char* buffer = 0; + size_t m = 1; + + if (0 != skipId3v2(fpStream, n)) + { + DispErr("Error updating LAME-tag frame:\n\n" + "can't locate old frame\n"); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + buffer = (unsigned char*)malloc(n); + + if (buffer == 0) + { + DispErr("Error updating LAME-tag frame:\n\n" + "can't allocate frame buffer\n"); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + /* Put it all to disk again */ + n = lame_get_lametag_frame(gfp, buffer, n); + if (n > 0) + { + m = fwrite(buffer, n, 1, fpStream); + } + free(buffer); + + if (m != 1) + { + DispErr("Error updating LAME-tag frame:\n\n" + "couldn't write frame into file\n"); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + } + return BE_ERR_SUCCESSFUL; + } + + __declspec(dllexport) BE_ERR beWriteInfoTag(HBE_STREAM hbeStream, + LPCSTR lpszFileName) + { + FILE* fpStream = NULL; + BE_ERR beResult = BE_ERR_SUCCESSFUL; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + if (NULL != gfp) + { + // Do we have to write the VBR tag? + if (lame_get_bWriteVbrTag(gfp)) + { + // Try to open the file + fpStream = fopen(lpszFileName, "rb+"); + + // Check file open result + if (NULL == fpStream) + { + beResult = BE_ERR_INVALID_FORMAT_PARAMETERS; + DispErr("Error updating LAME-tag frame:\n\n" + "can't open file for reading and writing\n"); + } + else + { + beResult = updateLameTagFrame(gfp, fpStream); + + // Close the file stream + fclose(fpStream); + } + } + + // clean up of allocated memory + lame_close(gfp); + } + else + { + beResult = BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + // return result + return beResult; + } + + // for backwards compatiblity + __declspec(dllexport) BE_ERR beWriteVBRHeader(LPCSTR lpszFileName) + { + return beWriteInfoTag((HBE_STREAM)gfp_save, lpszFileName); + } + + + BOOL APIENTRY DllMain(HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved) + { + (void)lpReserved; + gs_hModule = (HMODULE)hModule; + + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + // Enable debug/logging? + gs_bLogFile = GetPrivateProfileIntA("Debug", "WriteLogFile", gs_bLogFile, "lame_enc.ini"); + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; + } + + + static void dump_config(lame_global_flags* gfp) + { + DebugPrintf("\n\nLame_enc configuration options:\n"); + DebugPrintf("==========================================================\n"); + + DebugPrintf("version =%d\n", lame_get_version(gfp)); + DebugPrintf("Layer =3\n"); + DebugPrintf("mode ="); + switch (lame_get_mode(gfp)) + { + case STEREO: DebugPrintf("Stereo\n"); break; + case JOINT_STEREO: DebugPrintf("Joint-Stereo\n"); break; + case DUAL_CHANNEL: DebugPrintf("Forced Stereo\n"); break; + case MONO: DebugPrintf("Mono\n"); break; + case NOT_SET: /* FALLTROUGH */ + default: DebugPrintf("Error (unknown)\n"); break; + } + + DebugPrintf("Input sample rate =%.1f kHz\n", lame_get_in_samplerate(gfp) / 1000.0); + DebugPrintf("Output sample rate =%.1f kHz\n", lame_get_out_samplerate(gfp) / 1000.0); + + DebugPrintf("bitrate =%d kbps\n", lame_get_brate(gfp)); + DebugPrintf("Quality Setting =%d\n", lame_get_quality(gfp)); + + DebugPrintf("Low pass frequency =%d\n", lame_get_lowpassfreq(gfp)); + DebugPrintf("Low pass width =%d\n", lame_get_lowpasswidth(gfp)); + + DebugPrintf("High pass frequency =%d\n", lame_get_highpassfreq(gfp)); + DebugPrintf("High pass width =%d\n", lame_get_highpasswidth(gfp)); + + DebugPrintf("No short blocks =%d\n", lame_get_no_short_blocks(gfp)); + DebugPrintf("Force short blocks =%d\n", lame_get_force_short_blocks(gfp)); + + DebugPrintf("de-emphasis =%d\n", lame_get_emphasis(gfp)); + DebugPrintf("private flag =%d\n", lame_get_extension(gfp)); + + DebugPrintf("copyright flag =%d\n", lame_get_copyright(gfp)); + DebugPrintf("original flag =%d\n", lame_get_original(gfp)); + DebugPrintf("CRC =%s\n", lame_get_error_protection(gfp) ? "on" : "off"); + DebugPrintf("Fast mode =%s\n", (lame_get_quality(gfp)) ? "enabled" : "disabled"); + DebugPrintf("Force mid/side stereo =%s\n", (lame_get_force_ms(gfp)) ? "enabled" : "disabled"); + DebugPrintf("Disable Reservoir =%d\n", lame_get_disable_reservoir(gfp)); + DebugPrintf("Allow diff-short =%d\n", lame_get_allow_diff_short(gfp)); + DebugPrintf("Interchannel masking =%f\n", lame_get_interChRatio(gfp)); + DebugPrintf("Strict ISO Encoding =%s\n", (lame_get_strict_ISO(gfp)) ? "Yes" : "No"); + DebugPrintf("Scale =%5.2f\n", lame_get_scale(gfp)); + + DebugPrintf("VBR =%s, VBR_q =%d, VBR method =", + (lame_get_VBR(gfp) != vbr_off) ? "enabled" : "disabled", + lame_get_VBR_q(gfp)); + + switch (lame_get_VBR(gfp)) + { + case vbr_off: DebugPrintf("vbr_off\n"); break; + case vbr_mt: DebugPrintf("vbr_mt \n"); break; + case vbr_rh: DebugPrintf("vbr_rh \n"); break; + case vbr_mtrh: DebugPrintf("vbr_mtrh \n"); break; + case vbr_abr: + DebugPrintf("vbr_abr (average bitrate %d kbps)\n", lame_get_VBR_mean_bitrate_kbps(gfp)); + break; + default: + DebugPrintf("error, unknown VBR setting\n"); + break; + } + + DebugPrintf("Vbr Min bitrate =%d kbps\n", lame_get_VBR_min_bitrate_kbps(gfp)); + DebugPrintf("Vbr Max bitrate =%d kbps\n", lame_get_VBR_max_bitrate_kbps(gfp)); + + DebugPrintf("Write VBR Header =%s\n", (lame_get_bWriteVbrTag(gfp)) ? "Yes" : "No"); + DebugPrintf("VBR Hard min =%d\n", lame_get_VBR_hard_min(gfp)); + + DebugPrintf("ATH Only =%d\n", lame_get_ATHonly(gfp)); + DebugPrintf("ATH short =%d\n", lame_get_ATHshort(gfp)); + DebugPrintf("ATH no =%d\n", lame_get_noATH(gfp)); + DebugPrintf("ATH type =%d\n", lame_get_ATHtype(gfp)); + DebugPrintf("ATH lower =%f\n", lame_get_ATHlower(gfp)); + DebugPrintf("ATH aa =%d\n", lame_get_athaa_type(gfp)); + //DebugPrintf("ATH aa loudapprox =%d\n", lame_get_athaa_loudapprox( gfp ) ); + DebugPrintf("ATH aa sensitivity =%f\n", lame_get_athaa_sensitivity(gfp)); + + DebugPrintf("Experimental nspsytune =%d\n", lame_get_exp_nspsytune(gfp)); + DebugPrintf("Experimental X =%d\n", lame_get_experimentalX(gfp)); + DebugPrintf("Experimental Y =%d\n", lame_get_experimentalY(gfp)); + DebugPrintf("Experimental Z =%d\n", lame_get_experimentalZ(gfp)); + } + + + static void DispErr(wchar_t const* strErr) + { + MessageBox(NULL, strErr, L"LAME_ENC.DLL", MB_OK | MB_ICONHAND); + } + +#ifdef __cplusplus +} +#endif diff --git a/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.h b/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.h new file mode 100644 index 00000000..20aaff4d --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/BladeMP3EncDLL.h @@ -0,0 +1,278 @@ +/* + * Blade DLL Interface for LAME. + * + * Copyright (c) 1999 A.L. Faber + * Based on bladedll.h version 1.0 written by Jukka Poikolainen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef ___BLADEDLL_H_INCLUDED___ +#define ___BLADEDLL_H_INCLUDED___ + +#pragma pack(push) +#pragma pack(1) + +#ifdef __cplusplus +extern "C" { +#endif + +/* encoding formats */ + +#define BE_CONFIG_MP3 0 +#define BE_CONFIG_LAME 256 + +/* type definitions */ + +typedef unsigned long HBE_STREAM; +typedef HBE_STREAM *PHBE_STREAM; +typedef unsigned long BE_ERR; + +/* error codes */ + +#define BE_ERR_SUCCESSFUL 0x00000000 +#define BE_ERR_INVALID_FORMAT 0x00000001 +#define BE_ERR_INVALID_FORMAT_PARAMETERS 0x00000002 +#define BE_ERR_NO_MORE_HANDLES 0x00000003 +#define BE_ERR_INVALID_HANDLE 0x00000004 +#define BE_ERR_BUFFER_TOO_SMALL 0x00000005 + +/* other constants */ + +#define BE_MAX_HOMEPAGE 128 + +/* format specific variables */ + +#define BE_MP3_MODE_STEREO 0 +#define BE_MP3_MODE_JSTEREO 1 +#define BE_MP3_MODE_DUALCHANNEL 2 +#define BE_MP3_MODE_MONO 3 + + + +#define MPEG1 1 +#define MPEG2 0 + +#ifdef _BLADEDLL +#undef FLOAT + #include <Windows.h> +#endif + +#define CURRENT_STRUCT_VERSION 1 +#define CURRENT_STRUCT_SIZE sizeof(BE_CONFIG) // is currently 331 bytes + +/* OBSOLETE, VALUES STILL WORK +typedef enum +{ + NORMAL_QUALITY=0, + LOW_QUALITY, + HIGH_QUALITY, + VOICE_QUALITY +} LAME_QUALTIY_PRESET; + +*/ + + +typedef enum +{ + VBR_METHOD_NONE = -1, + VBR_METHOD_DEFAULT = 0, + VBR_METHOD_OLD = 1, + VBR_METHOD_NEW = 2, + VBR_METHOD_MTRH = 3, + VBR_METHOD_ABR = 4 +} VBRMETHOD; + +typedef enum +{ + LQP_NOPRESET=-1, + + // QUALITY PRESETS + LQP_NORMAL_QUALITY = 0, + LQP_LOW_QUALITY = 1, + LQP_HIGH_QUALITY = 2, + LQP_VOICE_QUALITY = 3, + LQP_R3MIX = 4, + LQP_VERYHIGH_QUALITY = 5, + LQP_STANDARD = 6, + LQP_FAST_STANDARD = 7, + LQP_EXTREME = 8, + LQP_FAST_EXTREME = 9, + LQP_INSANE = 10, + LQP_ABR = 11, + LQP_CBR = 12, + LQP_MEDIUM = 13, + LQP_FAST_MEDIUM = 14, + + // NEW PRESET VALUES + LQP_PHONE =1000, + LQP_SW =2000, + LQP_AM =3000, + LQP_FM =4000, + LQP_VOICE =5000, + LQP_RADIO =6000, + LQP_TAPE =7000, + LQP_HIFI =8000, + LQP_CD =9000, + LQP_STUDIO =10000 + +} LAME_QUALTIY_PRESET; + + + +typedef struct { + DWORD dwConfig; // BE_CONFIG_XXXXX + // Currently only BE_CONFIG_MP3 is supported + union { + + struct { + + DWORD dwSampleRate; // 48000, 44100 and 32000 allowed. RG note: also seems to support 16000, 22050, 24000. + BYTE byMode; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO + WORD wBitrate; // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 allowed. RG note: also seems to support 8,16,24. + BOOL bPrivate; + BOOL bCRC; + BOOL bCopyright; + BOOL bOriginal; + + } mp3; // BE_CONFIG_MP3 + + struct + { + // STRUCTURE INFORMATION + DWORD dwStructVersion; + DWORD dwStructSize; + + // BASIC ENCODER SETTINGS + DWORD dwSampleRate; // SAMPLERATE OF INPUT FILE + DWORD dwReSampleRate; // DOWNSAMPLERATE, 0=ENCODER DECIDES + LONG nMode; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO + DWORD dwBitrate; // CBR bitrate, VBR min bitrate + DWORD dwMaxBitrate; // CBR ignored, VBR Max bitrate + LONG nPreset; // Quality preset, use one of the settings of the LAME_QUALITY_PRESET enum + DWORD dwMpegVersion; // FUTURE USE, MPEG-1 OR MPEG-2 + DWORD dwPsyModel; // FUTURE USE, SET TO 0 + DWORD dwEmphasis; // FUTURE USE, SET TO 0 + + // BIT STREAM SETTINGS + BOOL bPrivate; // Set Private Bit (TRUE/FALSE) + BOOL bCRC; // Insert CRC (TRUE/FALSE) + BOOL bCopyright; // Set Copyright Bit (TRUE/FALSE) + BOOL bOriginal; // Set Original Bit (TRUE/FALSE) + + // VBR STUFF + BOOL bWriteVBRHeader; // WRITE XING VBR HEADER (TRUE/FALSE) + BOOL bEnableVBR; // USE VBR ENCODING (TRUE/FALSE) + INT nVBRQuality; // VBR QUALITY 0..9 + DWORD dwVbrAbr_bps; // Use ABR in stead of nVBRQuality + VBRMETHOD nVbrMethod; + BOOL bNoRes; // Disable Bit resorvoir + + // MISC SETTINGS + BOOL bStrictIso; // Use strict ISO encoding rules (TRUE/FALSE) + WORD nQuality; // Quality Setting, HIGH BYTE should be NOT LOW byte, otherwhise quality=5 + + // FUTURE USE, SET TO 0, align strucutre to 331 bytes + BYTE btReserved[255-4*sizeof(DWORD) - sizeof( WORD )]; + + } LHV1; // LAME header version 1 + + struct { + + DWORD dwSampleRate; + BYTE byMode; + WORD wBitrate; + BYTE byEncodingMethod; + + } aac; + + } format; + +} BE_CONFIG, *PBE_CONFIG; + + +typedef struct { + + // BladeEnc DLL Version number + + BYTE byDLLMajorVersion; + BYTE byDLLMinorVersion; + + // BladeEnc Engine Version Number + + BYTE byMajorVersion; + BYTE byMinorVersion; + + // DLL Release date + + BYTE byDay; + BYTE byMonth; + WORD wYear; + + // BladeEnc Homepage URL + + CHAR zHomepage[BE_MAX_HOMEPAGE + 1]; + + BYTE byAlphaLevel; + BYTE byBetaLevel; + BYTE byMMXEnabled; + + BYTE btReserved[125]; + + +} BE_VERSION, *PBE_VERSION; + +#ifndef _BLADEDLL + +typedef BE_ERR (*BEINITSTREAM) (PBE_CONFIG, PDWORD, PDWORD, PHBE_STREAM); +typedef BE_ERR (*BEENCODECHUNK) (HBE_STREAM, DWORD, PSHORT, PBYTE, PDWORD); +// added for floating point audio -- DSPguru, jd +typedef BE_ERR (*BEENCODECHUNKFLOATS16NI) (HBE_STREAM, DWORD, PFLOAT, PFLOAT, PBYTE, PDWORD); +typedef BE_ERR (*BEDEINITSTREAM) (HBE_STREAM, PBYTE, PDWORD); +typedef BE_ERR (*BECLOSESTREAM) (HBE_STREAM); +typedef VOID (*BEVERSION) (PBE_VERSION); +typedef VOID (*BEWRITEVBRHEADER) (LPCSTR); + +#define TEXT_BEINITSTREAM "beInitStream" +#define TEXT_BEENCODECHUNK "beEncodeChunk" +#define TEXT_BEENCODECHUNKFLOATS16NI "beEncodeChunkFloatS16NI" +#define TEXT_BEDEINITSTREAM "beDeinitStream" +#define TEXT_BECLOSESTREAM "beCloseStream" +#define TEXT_BEVERSION "beVersion" +#define TEXT_BEWRITEVBRHEADER "beWriteVBRHeader" + +#else + +__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream); +__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput); +// added for floating point audio -- DSPguru, jd +__declspec(dllexport) BE_ERR beEncodeChunkFloatS16NI(HBE_STREAM hbeStream, DWORD nSamples, PFLOAT buffer_l, PFLOAT buffer_r, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream); +__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion); +__declspec(dllexport) BE_ERR beWriteVBRHeader(LPCSTR lpszFileName); +__declspec(dllexport) BE_ERR beFlushNoGap(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beWriteInfoTag( HBE_STREAM hbeStream, LPCSTR lpszFileName); + +#endif + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Src/Plugins/Encoder/enc_lame/MP3Coder.cpp b/Src/Plugins/Encoder/enc_lame/MP3Coder.cpp new file mode 100644 index 00000000..7bf7d605 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/MP3Coder.cpp @@ -0,0 +1,196 @@ +#include "MP3Coder.h" + +AudioCoderMP3::~AudioCoderMP3() +{ + if (hbeStream) beCloseStream(hbeStream); hbeStream = 0; + if (bs) free(bs); bs = 0; +} + +int AudioCoderMP3::GetLastError() { return m_err; }; + +void AudioCoderMP3::setVbrFilename(char *filename) +{ + if (hbeStream) beCloseStream(hbeStream); + hbeStream = 0; + if (filename) + { + beWriteVBRHeader(filename); + } +} + +int AudioCoderMP3::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (m_err) return -1; + if (!hbeStream) + { + if (beInitStream(&beConfig, &ibuf_size_spls, &obuf_size, (PHBE_STREAM) &hbeStream) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + ibuf_size = ibuf_size_spls * bytesPerSample; + + if (is_downmix) ibuf_size *= 2; + + bs = (char*)malloc(ibuf_size); + bs_size = 0; + } + + + *in_used = 0; + + int needbytes = ibuf_size - bs_size; + if (needbytes > 0 && in_avail > 0) + { + if (needbytes > in_avail) + needbytes = in_avail; + memcpy(bs + bs_size, in, needbytes); + bs_size += needbytes; + *in_used = needbytes; + } + if (!done) + { + if (bs_size < (int)ibuf_size) return 0; + + } + + if (out_avail < (int)obuf_size) return 0; + + int feedBytes = min(bs_size, (int)ibuf_size); + int feedSamples = feedBytes / bytesPerSample; + bs_size -= feedBytes; + + if (is_downmix) + { + int x; + int l = feedBytes / 4; + short *b = (short*)bs; + for (x = 0; x < l; x ++) + { + b[x] = b[x * 2] / 2 + b[x * 2 + 1] / 2; + } + feedSamples/=2; + } + DWORD dwo = 0; + + if (feedSamples) + { + if (beEncodeChunk(hbeStream, feedSamples, (short*)bs, (unsigned char*)out, &dwo) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + } + if (!dwo && done==1) + { + if (beDeinitStream(hbeStream, (unsigned char *)out, &dwo) != BE_ERR_SUCCESSFUL) + { + m_err++; + return -1; + } + done++; + } + + return dwo; +} + +void AudioCoderMP3::PrepareToFinish() +{ + done = 1; +} + +AudioCoderMP3::AudioCoderMP3(int nch, int srate, int bps, configtype *cfg) + : obuf_size(0), ibuf_size(0), ibuf_size_spls(0), done(false), bs_size(0) +{ + m_err = 0; + hbeStream = 0; + bs = 0; + is_downmix = 0; + mono_input=0; + + memset(&beConfig, 0, sizeof(beConfig)); // clear all fields + + if (srate != 32000 + && srate != 44100 + && srate != 48000 + && srate != 16000 /* MPEG 2 sample rates */ + && srate != 22050 + && srate != 24000 + && srate != 11025 /* MPEG 2.5 sample rates */ + && srate != 12000 + && srate != 8000) + { + //MessageBox(NULL, "The only valid audio sampling rates for the LAME mp3 encoder are:\r\t16000\r\t22050\r\t24000\r\t32000\r\t44100\r\t48000\r\rPlease modify the encoding profile to use one of these sampling rates, and then try again.", "Invalid sampling rate", MB_OK); + m_err++; + return ; + } + + // use the LAME config structure + beConfig.dwConfig = BE_CONFIG_LAME; + + // this are the default settings for testcase.wav + beConfig.format.LHV1.dwStructVersion = 1; + beConfig.format.LHV1.dwStructSize = sizeof(beConfig); + beConfig.format.LHV1.dwSampleRate = srate; // INPUT FREQUENCY + + beConfig.format.LHV1.nMode = cfg->stereo_mode; + if (nch < 2) + { + beConfig.format.LHV1.nMode = BE_MP3_MODE_MONO; + mono_input=1; + } + else + { + if (beConfig.format.LHV1.nMode == BE_MP3_MODE_MONO) + is_downmix = 1; + // beConfig.format.LHV1.nMode = BE_MP3_MODE_STEREO; + } + + beConfig.format.LHV1.dwBitrate = cfg->bitrate; + beConfig.format.LHV1.dwMaxBitrate = (cfg->vbr_method != -1 ? cfg->vbr_max_bitrate : cfg->bitrate); + + beConfig.format.LHV1.dwReSampleRate = 0; // DOWNSAMPLERATE, 0=ENCODER DECIDES + + if (beConfig.format.LHV1.dwMaxBitrate < 32) // less than 32, let's force mono + { + if (nch > 1) + { + beConfig.format.LHV1.nMode = BE_MP3_MODE_MONO; + is_downmix = 1; + } + } + + /*int effective_nch = (beConfig.format.LHV1.nMode == BE_MP3_MODE_MONO) ? 1 : 2; + + if (beConfig.format.LHV1.dwReSampleRate >= 32000 && + beConfig.format.LHV1.dwMaxBitrate / effective_nch <= 32) + { + beConfig.format.LHV1.dwReSampleRate /= 2; + }*/ +/* + if (beConfig.format.LHV1.dwReSampleRate < 32000) + beConfig.format.LHV1.dwMpegVersion = MPEG2; // MPEG VERSION (I or II) + else + beConfig.format.LHV1.dwMpegVersion = MPEG1; // MPEG VERSION (I or II) +*/ + + beConfig.format.LHV1.nPreset = cfg->quality; + + beConfig.format.LHV1.dwPsyModel = 0; // USE DEFAULT PSYCHOACOUSTIC MODEL + beConfig.format.LHV1.dwEmphasis = 0; // NO EMPHASIS TURNED ON + + beConfig.format.LHV1.bOriginal = 0; // SET ORIGINAL FLAG + beConfig.format.LHV1.bCRC = 0; // INSERT CRC + beConfig.format.LHV1.bCopyright = 0; // SET COPYRIGHT FLAG + beConfig.format.LHV1.bPrivate = 0; // SET PRIVATE FLAG + beConfig.format.LHV1.bNoRes = 0; + beConfig.format.LHV1.bWriteVBRHeader = 1; + + beConfig.format.LHV1.bEnableVBR = cfg->vbr_method != VBR_METHOD_NONE; + beConfig.format.LHV1.nVBRQuality = cfg->vbr; + //beConfig.format.LHV1.dwVbrAbr_bps = (cfg->vbr_method != VBR_METHOD_NONE ? 1000 * cfg->abr_bitrate : 0); + beConfig.format.LHV1.dwVbrAbr_bps = (cfg->vbr_method == VBR_METHOD_ABR ? 1000 * cfg->abr_bitrate : 0); + beConfig.format.LHV1.nVbrMethod = (VBRMETHOD)cfg->vbr_method; + + bytesPerSample = bps / 8; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/MP3Coder.h b/Src/Plugins/Encoder/enc_lame/MP3Coder.h new file mode 100644 index 00000000..9a16b603 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/MP3Coder.h @@ -0,0 +1,62 @@ +#ifndef NULLSOFT_MP3_CODER_H +#define NULLSOFT_MP3_CODER_H + +#include <windows.h> +#include "../nsv/enc_if.h" +#include "BladeMP3EncDLL.h" +#ifndef _BLADEDLL +extern BEINITSTREAM beInitStream; +extern BECLOSESTREAM beCloseStream; +extern BEENCODECHUNK beEncodeChunk; +extern BEDEINITSTREAM beDeinitStream; +extern BEWRITEVBRHEADER beWriteVBRHeader; +extern BEVERSION beVersion; +extern BEENCODECHUNKFLOATS16NI beEncodeChunkFloatS16NI; +#endif // !_BLADEDLL + + + +typedef struct +{ + int bitrate; + int vbr_max_bitrate; + int abr_bitrate; + int stereo_mode; //0=stereo,1=jstereo,2=mchannel,3=mono + int quality; //0=normal,1=low,2=high,3=voice,4=r3mix,5=vh + + int vbr; // 0=high-9=low + int vbr_method; // -1=none, 0=default, 1=old, 2=new, 3=mtrh, 4=abr + +} +configtype; +class AudioCoderMP3 : public AudioCoder +{ +public: + AudioCoderMP3(int nch, int srate, int bps, configtype *cfg); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); + virtual ~AudioCoderMP3(); + int GetLastError(); + void setVbrFilename(char *filename); + void PrepareToFinish(); +protected: + int m_err; + DWORD obuf_size; + DWORD ibuf_size, ibuf_size_spls; + HBE_STREAM hbeStream; + BE_CONFIG beConfig; + int bytesPerSample; + int done; + char *bs; + int bs_size; + int is_downmix; + int mono_input; +}; + +class AudioCoderMP3_24 : public AudioCoderMP3 +{ +public: + AudioCoderMP3_24(int nch, int srate, int bps, configtype *cfg) : AudioCoderMP3(nch, srate, bps, cfg) {} +int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); +}; + +#endif
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/enc_lame.rc b/Src/Plugins/Encoder/enc_lame/enc_lame.rc new file mode 100644 index 00000000..b6d63988 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/enc_lame.rc @@ -0,0 +1,145 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MP3 DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "MP3 Encoder Options",IDC_STATIC,0,0,256,166 + LTEXT "Mode:",IDC_STATIC,4,13,21,8 + COMBOBOX IDC_VBRMETHOD,28,11,52,155,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_STEREOMODE,87,11,66,184,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Bitrate:",IDC_BITRATE_TEXT1,6,28,80,8 + COMBOBOX IDC_BITRATE,87,25,38,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "kbps",IDC_BITRATE_TEXT2,129,28,16,8 + LTEXT "VBR Maximum Bitrate:",IDC_MAXBITRATE_TEXT1,6,42,77,8 + COMBOBOX IDC_MAXBITRATE,87,39,38,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "kbps",IDC_MAXBITRATE_TEXT2,129,42,16,8 + LTEXT "Average Bitrate:",IDC_AVGBITRATE_TEXT1,6,56,77,8 + COMBOBOX IDC_AVGBITRATE,87,53,38,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "kbps",IDC_AVGBITRATE_TEXT2,129,56,16,8 + LTEXT "Quality:",IDC_STATIC,7,74,24,8 + COMBOBOX IDC_QUALITY,33,72,98,110,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "VBR Q:",IDC_VBRQ_TEXT,136,74,25,8 + COMBOBOX IDC_VBRQ,161,72,40,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "MPEG Layer-3 audio coding technology licensed from Fraunhofer IIS and Thomson.",IDC_STATIC,5,92,148,18,NOT WS_VISIBLE + LTEXT "MPEG Layer-3 encoding technology by Mp3dev.",IDC_STATIC,5,115,154,8 + LTEXT "",IDC_LAMEVERSION,136,153,114,8,0,WS_EX_RIGHT +END + +IDD_MP3_MISSING DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "MP3 Encoder Options",-1,0,0,256,166 + LTEXT "MP3 encoding support is not available as ""lame_enc.dll"" is not present.\n\nYou will need to manually download ""lame_enc.dll"" to the Winamp\Shared folder to enable MP3 encoding support.",-1,12,14,231,34 + LTEXT "Click here for information on where you can obtain ""lame_enc.dll"".",-1,12,54,231,10 + CONTROL "here",IDC_URL1,"Button",BS_OWNERDRAW | WS_TABSTOP,27,54,15,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + 65535 "{F1534ECA-6E64-42c2-9781-812E61154515}" +END + +STRINGTABLE +BEGIN + IDS_BITRATE "Bitrate:" + IDS_ABR_MIN_BITRATE "ABR Minimum Bitrate" + IDS_VBR_MIN_BITRATE "VBR Minimum Bitrate" + IDS_N_A "N/A" + IDS_ABR_MAX_BITRATE "ABR Maximum Bitrate" + IDS_VBR_MAX_BITRATE "VBR Maximum Bitrate" + IDS_AVERAGE_BITRATE "Average Bitrate" + IDS_STEREO "Stereo" + IDS_JOINT_STEREO "Joint Stereo" + IDS_MULTI_CHANNEL "Multi-Channel" + IDS_MONO "Mono" + IDS_NORMAL "Normal" + IDS_LOW "Low" + IDS_HIGH "High" + IDS_VOICE "Voice" + IDS_R3MIX "R3mix" +END + +STRINGTABLE +BEGIN + IDS_VERY_HIGH "Very High" + IDS_HIGH_BRACKET "(High)" + IDS_LOW_BRACKET "(Low)" + IDS_ENC_LAME_DESC "MP3 Encoder %s" + IDS_ENC_LAME_DESC_MISSING "MP3 Encoder %s [NOT LOADED]" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_lame/enc_lame.sln b/Src/Plugins/Encoder/enc_lame/enc_lame.sln new file mode 100644 index 00000000..4af92741 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/enc_lame.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29509.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_lame", "enc_lame.vcxproj", "{861F24D8-9B22-42FA-B056-7A86D6B4500C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Debug|Win32.ActiveCfg = Debug|Win32 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Debug|Win32.Build.0 = Debug|Win32 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Debug|x64.ActiveCfg = Debug|x64 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Debug|x64.Build.0 = Debug|x64 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Release|Win32.ActiveCfg = Release|Win32 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Release|Win32.Build.0 = Release|Win32 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Release|x64.ActiveCfg = Release|x64 + {861F24D8-9B22-42FA-B056-7A86D6B4500C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CC41ED85-6766-472A-9C3A-5E89A14D82B6} + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj b/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj new file mode 100644 index 00000000..6dcaa1eb --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj @@ -0,0 +1,293 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{861F24D8-9B22-42FA-B056-7A86D6B4500C}</ProjectGuid> + <RootNamespace>enc_lame</RootNamespace> + <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Label="Vcpkg"> + <VcpkgEnableManifest>false</VcpkgEnableManifest> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include\lame</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WINDOWS;_USRDLL;_BLADEDLL;NSV_CODER_MP3_EXPORTS;WINDOWS_IGNORE_PACKING_MISMATCH;WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <StructMemberAlignment>Default</StructMemberAlignment> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;libmp3lame-static.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\debug\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\</Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ and if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Shared\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include\lame</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;_BLADEDLL;NSV_CODER_MP3_EXPORTS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\debug\lib\libmp3lame-static.lib</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\debug\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\</Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ and if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Shared\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include\lame</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WINDOWS;_USRDLL;_BLADEDLL;NSV_CODER_MP3_EXPORTS;WINDOWS_IGNORE_PACKING_MISMATCH;NDEBUG;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <StructMemberAlignment>Default</StructMemberAlignment> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;libmp3lame-static.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\</Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ and if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Shared\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include\lame</AdditionalIncludeDirectories> + <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;NSV_CODER_MP3_EXPORTS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>shlwapi.lib;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\lib\libmp3lame-static.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\debug\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +if exist ..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\</Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ and if exist ..\..\..\resources\libraries\lame_enc.dll xcopy /Y /D ..\..\..\resources\libraries\lame_enc.dll ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Shared\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="24bit.cpp" /> + <ClCompile Include="BladeMP3EncDLL.c" /> + <ClCompile Include="main.cpp"> + <!--PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">WIN32;NDEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">WIN32;NDEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions--> + </ClCompile> + <ClCompile Include="MP3Coder.cpp" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_lame.rc" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="BladeMP3EncDLL.h" /> + <ClInclude Include="MP3Coder.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj"> + <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj.filters b/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj.filters new file mode 100644 index 00000000..67ebcd12 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/enc_lame.vcxproj.filters @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="24bit.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="main.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MP3Coder.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="BladeMP3EncDLL.c"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MP3Coder.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="BladeMP3EncDLL.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{dc9d6b9d-69d1-40a7-97c9-870cfa399631}</UniqueIdentifier> + </Filter> + <Filter Include="Ressource Files"> + <UniqueIdentifier>{3e0eac86-0886-4e85-a300-8b6cb497e2a7}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{bf0f4053-1c32-4453-a394-6542b1301613}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_lame.rc"> + <Filter>Ressource Files</Filter> + </ResourceCompile> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/main.cpp b/Src/Plugins/Encoder/enc_lame/main.cpp new file mode 100644 index 00000000..197c3bb1 --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/main.cpp @@ -0,0 +1,503 @@ +/* +** nsv_coder_lame: main.cpp - LAME mp3 encoder plug-in +** (requires lame_enc.dll) +** +** Copyright (C) 2001-2006 Nullsoft, Inc. +** +** This software is provided 'as-is', without any express or implied warranty. +** In no event will the authors be held liable for any damages arising from the use of this software. +** +** Permission is granted to anyone to use this software for any purpose, including commercial +** applications, and to alter it and redistribute it freely, subject to the following restrictions: +** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the +** original software. If you use this software in a product, an acknowledgment in the product +** documentation would be appreciated but is not required. +** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as +** being the original software. +** 3. This notice may not be removed or altered from any source distribution. +*/ + +#define ENC_VERSION "v1.38" + +#include <stdio.h> +#include "resource.h" +#include "BladeMP3EncDLL.h" +#include "MP3Coder.h" +#include <strsafe.h> +#include <shlwapi.h> +#include <lame/lame.h> + +// wasabi based services for localisation support +#include <api/service/waServiceFactory.h> +#include "../Agave/Language/api_language.h" +#include "../winamp/wa_ipc.h" + +HWND winampwnd = 0; +api_service *WASABI_API_SVC = 0; +api_language *WASABI_API_LNG = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; + +int g_valid_bitrates[] = { 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1 }; + +static wchar_t lamedll[MAX_PATH]=L""; +HINSTANCE g_lamedll = 0; + +//BEINITSTREAM beInitStream=0; +//BECLOSESTREAM beCloseStream=0; +//BEENCODECHUNK beEncodeChunk=0; +//BEDEINITSTREAM beDeinitStream=0; +//BEWRITEVBRHEADER beWriteVBRHeader=0; +//BEVERSION beVersion=0; +//BEENCODECHUNKFLOATS16NI beEncodeChunkFloatS16NI=0; + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if(!WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf; + sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncLameLangGUID); + } +} +/* +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + return TRUE; +}*/ + +typedef struct +{ + configtype cfg; + char configfile[MAX_PATH]; +} +configwndrec; + +void BuildVersionString(wchar_t version[128]) +{ + BE_VERSION ver; + beVersion(&ver); + + if (ver.byBetaLevel) + StringCchPrintf(version, 128, L"%u.%ub%u", (unsigned int)ver.byMajorVersion, (unsigned int)ver.byMinorVersion, (unsigned int)ver.byBetaLevel); + else if (ver.byAlphaLevel) + StringCchPrintf(version, 128, L"%u.%ua%u", (unsigned int)ver.byMajorVersion, (unsigned int)ver.byMinorVersion, (unsigned int)ver.byAlphaLevel); + else + StringCchPrintf(version, 128, L"%u.%u", (unsigned int)ver.byMajorVersion, (unsigned int)ver.byMinorVersion); +} + +void readconfig(char *configfile, configtype *cfg) +{ + cfg->bitrate = 128; + cfg->vbr_max_bitrate = 320; + cfg->abr_bitrate = 128; + + cfg->stereo_mode = 1; + cfg->quality = LQP_FAST_STANDARD; + + cfg->vbr = 2; + cfg->vbr_method = VBR_METHOD_NEW; + + if (configfile) + GetPrivateProfileStructA("audio_mp3l", "conf", cfg, sizeof(configtype), configfile); +} + +void writeconfig(char* configfile, configtype *cfg) +{ + if (configfile) + WritePrivateProfileStructA("audio_mp3l", "conf", cfg, sizeof(configtype), configfile); +} + +extern "C" +{ + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + //if ((g_lamedll != NULL) && (beInitStream != NULL) && (beCloseStream != NULL) && (beEncodeChunk != NULL) && (beDeinitStream != NULL) && (beWriteVBRHeader != NULL) && (beVersion != NULL)) + if (idx == 0) + { + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDS_ENC_LAME_DESC), ENC_VERSION); + return mmioFOURCC('M', 'P', '3', 'l'); + } + return 0; + } + + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (nch > 2 || srate > 48000) + return NULL; + + if (srct == mmioFOURCC('P', 'C', 'M', ' ') && *outt == mmioFOURCC('M', 'P', '3', 'l')) + { + configtype cfg; + readconfig(configfile, &cfg); + *outt = mmioFOURCC('M', 'P', '3', ' '); + AudioCoderMP3 *t=0; + if (bps != 16) + t = new AudioCoderMP3_24(nch, srate, bps, &cfg); + else + t = new AudioCoderMP3(nch, srate, bps, &cfg); + if (t->GetLastError()) + { + delete t; + return NULL; + } + return t; + } + return NULL; + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + //beWriteVBRHeader(filename); + ((AudioCoderMP3*)coder)->setVbrFilename((char *)filename); //apparently this needs to be called after beCloseStream + } + + void __declspec(dllexport) PrepareToFinish(const char *filename, AudioCoder *coder) + { + ((AudioCoderMP3*)coder)->PrepareToFinish(); + } + + static void setBitrates(HWND hwndDlg, int mi, int ma) + { + int i = 0; + while (g_valid_bitrates[i] > 0) + { + if (g_valid_bitrates[i] == mi) SendDlgItemMessage(hwndDlg, IDC_BITRATE, CB_SETCURSEL, i, 0); + if (g_valid_bitrates[i] == ma) SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_SETCURSEL, i, 0); + i++; + } + } + + BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + if (uMsg == WM_USER + 666) + { + int vbr_meth = (int)SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_GETCURSEL, 0, 0); + if (vbr_meth == CB_ERR) vbr_meth = 0; + vbr_meth--; + EnableWindow(GetDlgItem(hwndDlg, IDC_VBRQ), vbr_meth != -1 && vbr_meth != 4); + EnableWindow(GetDlgItem(hwndDlg, IDC_VBRQ_TEXT), vbr_meth != -1 && vbr_meth != 4); + SetDlgItemTextW(hwndDlg, IDC_BITRATE_TEXT1, WASABI_API_LNGSTRINGW((vbr_meth == -1 ? IDS_BITRATE : vbr_meth == 4 ? IDS_ABR_MIN_BITRATE : IDS_VBR_MIN_BITRATE))); + SetDlgItemTextW(hwndDlg, IDC_MAXBITRATE_TEXT1, WASABI_API_LNGSTRINGW((vbr_meth == -1 ? IDS_N_A : vbr_meth == 4 ? IDS_ABR_MAX_BITRATE : IDS_VBR_MAX_BITRATE))); + SetDlgItemTextW(hwndDlg, IDC_AVGBITRATE_TEXT1, WASABI_API_LNGSTRINGW((vbr_meth != 4 ? IDS_N_A : IDS_AVERAGE_BITRATE))); + + EnableWindow(GetDlgItem(hwndDlg, IDC_MAXBITRATE_TEXT1), vbr_meth != -1); + EnableWindow(GetDlgItem(hwndDlg, IDC_MAXBITRATE_TEXT2), vbr_meth != -1); + EnableWindow(GetDlgItem(hwndDlg, IDC_MAXBITRATE), vbr_meth != -1); + EnableWindow(GetDlgItem(hwndDlg, IDC_AVGBITRATE_TEXT1), vbr_meth == 4); + EnableWindow(GetDlgItem(hwndDlg, IDC_AVGBITRATE_TEXT2), vbr_meth == 4); + EnableWindow(GetDlgItem(hwndDlg, IDC_AVGBITRATE), vbr_meth == 4); + + int qual = (int)SendDlgItemMessage(hwndDlg, IDC_QUALITY, CB_GETCURSEL, 0, 0); + if (qual == CB_ERR) qual = 0; + switch (qual) + { + case LQP_R3MIX: + case LQP_STANDARD: + case LQP_FAST_STANDARD: + case LQP_EXTREME: + case LQP_FAST_EXTREME: + case LQP_INSANE: + case LQP_MEDIUM: + case LQP_FAST_MEDIUM: + case LQP_ABR: + case LQP_CBR: + EnableWindow(GetDlgItem(hwndDlg, IDC_STEREOMODE), 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_VBRMETHOD), 0); + break; + default: + EnableWindow(GetDlgItem(hwndDlg, IDC_STEREOMODE), 1); + EnableWindow(GetDlgItem(hwndDlg, IDC_VBRMETHOD), 1); + break; + } + if (qual == 4) EnableWindow(GetDlgItem(hwndDlg, IDC_VBRQ), 0); + } + + if (uMsg == WM_USER + 667) + { + int qual = (int)SendDlgItemMessage(hwndDlg, IDC_QUALITY, CB_GETCURSEL, 0, 0); + if (qual == CB_ERR) qual = 0; + switch (qual) + { + case LQP_R3MIX: + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 3, 0); + setBitrates(hwndDlg, 96, 224); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 1, 0); + break; + case LQP_STANDARD: /* check for alt-preset standard */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 2, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_FAST_STANDARD: /* check for alt-preset fast standard */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 3, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_MEDIUM: /* check for alt-preset medium */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 2, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_FAST_MEDIUM: /* check for alt-preset fast medium */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 3, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_EXTREME: /* check for alt-preset extreme */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 2, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_FAST_EXTREME: /* check for alt-preset fast extreme */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 3, 0); + setBitrates(hwndDlg, 32, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_INSANE: /* check for alt-preset fast insane */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 0, 0); + setBitrates(hwndDlg, 320, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + break; + case LQP_ABR: /* check for alt-preset fast insane */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 5, 0); + setBitrates(hwndDlg, 64, 320); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, 2, 0); + break; + case LQP_CBR: /* check for alt-preset fast insane */ + SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, 0, 0); + SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, 1, 0); + break; + } + SendMessage(hwndDlg, WM_USER + 666, 0, 0); + } + + if (uMsg == WM_INITDIALOG) + { +#if defined (_WIN64) + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); +#else + SetWindowLong(hwndDlg, GWL_USERDATA, lParam); +#endif + wchar_t versionText[128] = {0}; + BuildVersionString(versionText); + SetDlgItemText(hwndDlg, IDC_LAMEVERSION, versionText); + if (lParam) + { + configwndrec *wc = (configwndrec*)lParam; + + // -1=none, 0=default, 1=old, 2=new, 3=mtrh, 4=abr + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"CBR"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"VBR default"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"VBR old"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"VBR new"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"VBR mtrh"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_ADDSTRING, 0, (LPARAM)L"ABR"); + SendDlgItemMessageW(hwndDlg, IDC_VBRMETHOD, CB_SETCURSEL, wc->cfg.vbr_method + 1, 0); + + //0=stereo,1=jstereo,2=mchannel,3=mono + SendDlgItemMessageW(hwndDlg, IDC_STEREOMODE, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_STEREO)); + SendDlgItemMessageW(hwndDlg, IDC_STEREOMODE, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_JOINT_STEREO)); + SendDlgItemMessageW(hwndDlg, IDC_STEREOMODE, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_MULTI_CHANNEL)); + SendDlgItemMessageW(hwndDlg, IDC_STEREOMODE, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_MONO)); + SendDlgItemMessageW(hwndDlg, IDC_STEREOMODE, CB_SETCURSEL, wc->cfg.stereo_mode, 0); + + { + int i = 0; + while (g_valid_bitrates[i] > 0) + { + wchar_t buf[64] = {0}; + StringCchPrintf(buf, 64, L"%d", g_valid_bitrates[i]); + SendDlgItemMessage(hwndDlg, IDC_BITRATE , CB_ADDSTRING, 0, (LPARAM)buf); + SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_ADDSTRING, 0, (LPARAM)buf); + SendDlgItemMessage(hwndDlg, IDC_AVGBITRATE, CB_ADDSTRING, 0, (LPARAM)buf); + SendDlgItemMessage(hwndDlg, IDC_BITRATE , CB_SETITEMDATA, i, g_valid_bitrates[i]); + SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_SETITEMDATA, i, g_valid_bitrates[i]); + SendDlgItemMessage(hwndDlg, IDC_AVGBITRATE, CB_SETITEMDATA, i, g_valid_bitrates[i]); + i++; + }; + + i = 0; + while (g_valid_bitrates[i] > 0) + { + if (g_valid_bitrates[i] == wc->cfg.bitrate ) SendDlgItemMessage(hwndDlg, IDC_BITRATE , CB_SETCURSEL, i, 0); + if (g_valid_bitrates[i] == wc->cfg.abr_bitrate ) SendDlgItemMessage(hwndDlg, IDC_AVGBITRATE, CB_SETCURSEL, i, 0); + if (g_valid_bitrates[i] == wc->cfg.vbr_max_bitrate) SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_SETCURSEL, i, 0); + i++; + } + } + + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_NORMAL)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_LOW)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_HIGH)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_VOICE)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_R3MIX)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_VERY_HIGH)); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset standard"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset fast standard"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset extreme"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset fast extreme"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset insane"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset abr"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset cbr"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset medium"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_ADDSTRING, 0, (LPARAM)L"--alt-preset fast medium"); + SendDlgItemMessageW(hwndDlg, IDC_QUALITY, CB_SETCURSEL, wc->cfg.quality, 0); + + int x; + for (x = 0; x < 10; x ++) + { + wchar_t buf[123] = {0}; + StringCchPrintfW(buf, 123, L"%d%s", x, x == 0 ? WASABI_API_LNGSTRINGW(IDS_HIGH_BRACKET) : x == 9 ? WASABI_API_LNGSTRINGW(IDS_LOW_BRACKET) : L""); + SendDlgItemMessageW(hwndDlg, IDC_VBRQ, CB_ADDSTRING, 0, (LPARAM)buf); + } + SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_SETCURSEL, wc->cfg.vbr, 0); + + SendMessage(hwndDlg, WM_USER + 666, 0, 0); + } + } + + if (uMsg == WM_COMMAND) + { + if (LOWORD(wParam) == IDC_VBRMETHOD && HIWORD(wParam) == CBN_SELCHANGE) + SendMessage(hwndDlg, WM_USER + 666, 0, 0); + if (LOWORD(wParam) == IDC_QUALITY && HIWORD(wParam) == CBN_SELCHANGE) + SendMessage(hwndDlg, WM_USER + 667, 0, 0); + } + + if (uMsg == WM_DESTROY) + { +#if defined (_WIN64) + configwndrec *wc = (configwndrec*)SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); +#else + configwndrec* wc = (configwndrec*)SetWindowLong(hwndDlg, GWL_USERDATA, 0); +#endif + if (wc) + { + wc->cfg.bitrate = (int)SendDlgItemMessage(hwndDlg, IDC_BITRATE , CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_BITRATE , CB_GETCURSEL, 0, 0), 0); + wc->cfg.vbr_max_bitrate = (int)SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_MAXBITRATE, CB_GETCURSEL, 0, 0), 0); + wc->cfg.abr_bitrate = (int)SendDlgItemMessage(hwndDlg, IDC_AVGBITRATE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_AVGBITRATE, CB_GETCURSEL, 0, 0), 0); + int vbr_meth = (int)SendDlgItemMessage(hwndDlg, IDC_VBRMETHOD, CB_GETCURSEL, 0, 0); + if (vbr_meth == CB_ERR) vbr_meth = 0; + wc->cfg.vbr_method = vbr_meth - 1; + wc->cfg.stereo_mode = (int)SendDlgItemMessage(hwndDlg, IDC_STEREOMODE, CB_GETCURSEL, 0, 0); + wc->cfg.quality = (int)SendDlgItemMessage(hwndDlg, IDC_QUALITY, CB_GETCURSEL, 0, 0); + wc->cfg.vbr = (int)SendDlgItemMessage(hwndDlg, IDC_VBRQ, CB_GETCURSEL, 0, 0); + writeconfig(wc->configfile, &wc->cfg); + free(wc); + } + } + return 0; + } + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, char*configfile) + { + if (outt == mmioFOURCC('M', 'P', '3', 'l')) + { + configwndrec *wr = (configwndrec*)malloc(sizeof(configwndrec)); + if (configfile) lstrcpynA(wr->configfile, configfile, MAX_PATH); + else wr->configfile[0] = 0; + + readconfig(configfile, &wr->cfg); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_MP3, hwndParent, DlgProc, (LPARAM)wr); + } + return NULL; + } + + int __declspec(dllexport) SetConfigItem(unsigned int outt, wchar_t*item, char *data, char* configfile) + { + if (outt == mmioFOURCC('M', 'P', '3', 'l')) + { + configtype cfg; + readconfig(configfile, &cfg); + if (!lstrcmpi(item, L"bitrate")) // assume CBR bitrate + { + cfg.abr_bitrate = cfg.bitrate = atoi(data); + cfg.vbr_method = -1; + } + writeconfig(configfile, &cfg); + return 1; + } + return 0; + } + + int __declspec(dllexport) GetConfigItem(unsigned int outt, wchar_t *item, wchar_t *data, int len, char* configfile) + { + if (outt == mmioFOURCC('M', 'P', '3', 'l')) + { + configtype cfg; + readconfig(configfile, &cfg); + if (!lstrcmpi(item, L"bitrate")) + { + int bitrate; + if(cfg.vbr_method == -1) bitrate = cfg.bitrate; + else if(cfg.vbr_method == 4) bitrate = cfg.abr_bitrate; + else bitrate = (cfg.bitrate + cfg.vbr_max_bitrate) / 2; + StringCchPrintf(data,len,L"%d",bitrate); + } + return 1; + } + return 0; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + + // this is called when the encoder is needed (and is slightly better than the dllmain loading from before) + + /*if (!g_lamedll) + { + if (!lamedll[0]) + { + PathCombineW(lamedll, (wchar_t*)SendMessage(hwnd, WM_WA_IPC, 0, IPC_GETSHAREDDLLDIRECTORYW),L"lame_enc.dll"); + } + g_lamedll = LoadLibraryW(lamedll); + }*/ + + /*if (g_lamedll) + { + beInitStream = (BEINITSTREAM) &beInitStream; + beCloseStream = (BECLOSESTREAM) GetProcAddress(g_lamedll, TEXT_BECLOSESTREAM); + beEncodeChunk = (BEENCODECHUNK) GetProcAddress(g_lamedll, TEXT_BEENCODECHUNK); + beDeinitStream = (BEDEINITSTREAM) GetProcAddress(g_lamedll, TEXT_BEDEINITSTREAM); + beWriteVBRHeader = (BEWRITEVBRHEADER) GetProcAddress(g_lamedll, TEXT_BEWRITEVBRHEADER); + beVersion = (BEVERSION) GetProcAddress(g_lamedll, TEXT_BEVERSION); + beEncodeChunkFloatS16NI = (BEENCODECHUNKFLOATS16NI)GetProcAddress(g_lamedll, TEXT_BEENCODECHUNKFLOATS16NI); + }*/ + } +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_lame/resource.h b/Src/Plugins/Encoder/enc_lame/resource.h new file mode 100644 index 00000000..12db614a --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/resource.h @@ -0,0 +1,57 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by enc_lame.rc +// +#define IDS_BITRATE 0 +#define IDS_ABR_MIN_BITRATE 1 +#define IDS_VBR_MIN_BITRATE 2 +#define IDS_N_A 3 +#define IDS_ABR_MAX_BITRATE 4 +#define IDS_VBR_MAX_BITRATE 5 +#define IDS_AVERAGE_BITRATE 6 +#define IDS_STEREO 7 +#define IDS_JOINT_STEREO 8 +#define IDS_MULTI_CHANNEL 9 +#define IDS_MONO 10 +#define IDS_NORMAL 11 +#define IDS_LOW 12 +#define IDS_HIGH 13 +#define IDS_VOICE 14 +#define IDS_R3MIX 15 +#define IDS_VERY_HIGH 16 +#define IDS_HIGH_BRACKET 17 +#define IDS_LOW_BRACKET 18 +#define IDS_ENC_LAME_DESC 19 +#define IDS_ENC_LAME_DESC_MISSING 20 +#define IDD_MP3 102 +#define IDD_MP3_MISSING 105 +#define IDC_BITRATE 1000 +#define IDC_VBR 1001 +#define IDC_QUALITY 1002 +#define IDC_JSTEREO1 1003 +#define IDC_JSTEREO2 1004 +#define IDC_BITRATE_TEXT1 1004 +#define IDC_MAXBITRATE 1005 +#define IDC_BITRATE_TEXT2 1006 +#define IDC_MAXBITRATE_TEXT1 1007 +#define IDC_MAXBITRATE_TEXT2 1008 +#define IDC_VBRMETHOD 1009 +#define IDC_AVGBITRATE_TEXT1 1010 +#define IDC_AVGBITRATE 1011 +#define IDC_AVGBITRATE_TEXT2 1012 +#define IDC_STEREOMODE 1013 +#define IDC_VBRQ_TEXT 1014 +#define IDC_VBRQ 1015 +#define IDC_LAMEVERSION 1016 +#define IDC_URL1 1026 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1017 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_lame/version.rc2 b/Src/Plugins/Encoder/enc_lame/version.rc2 new file mode 100644 index 00000000..a1a762ea --- /dev/null +++ b/Src/Plugins/Encoder/enc_lame/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,38,0,0 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "1,38,0,0" + VALUE "InternalName", "Nullsoft MP3 Encoder" + VALUE "LegalCopyright", "Copyright © 2006-2023 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_lame.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_vorbis/Libs/libogg_static.lib b/Src/Plugins/Encoder/enc_vorbis/Libs/libogg_static.lib Binary files differnew file mode 100644 index 00000000..a4010fe6 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/Libs/libogg_static.lib diff --git a/Src/Plugins/Encoder/enc_vorbis/Libs/vorbis_static.lib b/Src/Plugins/Encoder/enc_vorbis/Libs/vorbis_static.lib Binary files differnew file mode 100644 index 00000000..8b5409f9 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/Libs/vorbis_static.lib diff --git a/Src/Plugins/Encoder/enc_vorbis/Libs/vorbisenc_static.lib b/Src/Plugins/Encoder/enc_vorbis/Libs/vorbisenc_static.lib Binary files differnew file mode 100644 index 00000000..4f7d7cc0 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/Libs/vorbisenc_static.lib diff --git a/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.rc b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.rc new file mode 100644 index 00000000..9eec33de --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.rc @@ -0,0 +1,100 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONFIG DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Ogg Vorbis Encoder Options",IDC_STATIC,0,0,256,166 + LTEXT "Quality Factor: 0.0",IDC_VBRVAL,7,13,149,8 + CONTROL "",IDC_VBRQUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,5,23,243,17 + LTEXT "Low Quality\nSmall Files",IDC_VBR1,9,43,44,22 + LTEXT "High Quality\nLarge Files",IDC_VBR2,208,43,40,22 + LTEXT "Ogg Vorbis is an open, free audio format,\nThis encoder is based on aoTuV,",IDC_STATIC,5,143,242,19 + CONTROL "http://xiph.org/vorbis/",IDC_URL1,"Button",BS_OWNERDRAW | WS_TABSTOP,138,143,78,8 + CONTROL "https://ao-yumi.github.io/aotuv_web/index.html",IDC_URL2,"Button",BS_OWNERDRAW | WS_TABSTOP,109,151,138,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + 65535 "{A23C2B70-C66B-475e-8A67-E0F33FD5BD12}" +END + +STRINGTABLE +BEGIN + IDS_ENC_VORBIS_DESC "Ogg Vorbis Encoder" + IDS_QUALITY_FACTOR_F_KBPS "Quality Factor: %.1lf (%d kbps)" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.sln b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.sln new file mode 100644 index 00000000..bc12bed6 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.sln @@ -0,0 +1,60 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29519.181 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_vorbis", "enc_vorbis.vcxproj", "{3AC18E6A-7C92-4156-8117-CAFC6A781DAD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis_static", "..\libvorbis\win32\vorbis_static.vcxproj", "{49238ED1-3146-49AB-9523-E9826EE4A0C8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "..\libvorbis\win32\vorbisfile_static.vcxproj", "{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "..\libogg\libogg.vcxproj", "{4FC28B55-2A14-43D5-86F7-201054F338A9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Debug|Win32.Build.0 = Debug|Win32 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Debug|x64.ActiveCfg = Debug|x64 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Debug|x64.Build.0 = Debug|x64 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Release|Win32.ActiveCfg = Release|Win32 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Release|Win32.Build.0 = Release|Win32 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Release|x64.ActiveCfg = Release|x64 + {3AC18E6A-7C92-4156-8117-CAFC6A781DAD}.Release|x64.Build.0 = Release|x64 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|Win32.ActiveCfg = Debug|Win32 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|Win32.Build.0 = Debug|Win32 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|x64.ActiveCfg = Debug|x64 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|x64.Build.0 = Debug|x64 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|Win32.ActiveCfg = Release|Win32 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|Win32.Build.0 = Release|Win32 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|x64.ActiveCfg = Release|x64 + {49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|x64.Build.0 = Release|x64 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|Win32.Build.0 = Debug|Win32 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|x64.ActiveCfg = Debug|x64 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|x64.Build.0 = Debug|x64 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|Win32.ActiveCfg = Release|Win32 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|Win32.Build.0 = Release|Win32 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|x64.ActiveCfg = Release|x64 + {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|x64.Build.0 = Release|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.Build.0 = Debug|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.ActiveCfg = Debug|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.Build.0 = Debug|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.ActiveCfg = Release|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.Build.0 = Release|Win32 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.ActiveCfg = Release|x64 + {4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3845173A-0CB9-4C0E-86B0-284CCE7B043A} + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj new file mode 100644 index 00000000..fff72316 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj @@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{3AC18E6A-7C92-4156-8117-CAFC6A781DAD}</ProjectGuid> + <RootNamespace>enc_vorbis</RootNamespace> + <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Label="Vcpkg"> + <VcpkgEnableManifest>false</VcpkgEnableManifest> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <VcpkgInstalledDir> + </VcpkgInstalledDir> + <VcpkgUseStatic>false</VcpkgUseStatic> + <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;NSV_CODER_MP3_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ObjectFileName>$(IntDir)</ObjectFileName> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>Default</CompileAs> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4204 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\openmpt-trunk\build\lib\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;NSV_CODER_MP3_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ObjectFileName>$(IntDir)</ObjectFileName> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>Default</CompileAs> + <DisableSpecificWarnings>4312;4701;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4204 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\openmpt-trunk\build\lib\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;NSV_CODER_MP3_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ObjectFileName>$(IntDir)</ObjectFileName> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <DisableSpecificWarnings>4701;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4210 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\openmpt-trunk\build\lib\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;NSV_CODER_MP3_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ObjectFileName>$(IntDir)</ObjectFileName> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <DisableSpecificWarnings>4312;4701;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4210 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>uxtheme.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <AdditionalLibraryDirectories>..\..\..\external_dependencies\openmpt-trunk\build\lib\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <DelayLoadDLLs>uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj"> + <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <ClCompile Include="main.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">WIN64;_DEBUG;_WINDOWS;_MBCS;_USRDLL;NSV_CODER_MP3_EXPORTS</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_vorbis.rc" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="resource.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj.filters b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj.filters new file mode 100644 index 00000000..78b0008e --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/enc_vorbis.vcxproj.filters @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{60891243-3702-45a9-8316-6dd4c4fe1657}</UniqueIdentifier> + </Filter> + <Filter Include="Ressource Files"> + <UniqueIdentifier>{0dcd9aec-855c-4009-8908-41d2d4c57e21}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{327bdd16-a664-4de5-9595-33490dffe0f7}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_vorbis.rc"> + <Filter>Ressource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <ClCompile Include="main.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_vorbis/main.cpp b/Src/Plugins/Encoder/enc_vorbis/main.cpp new file mode 100644 index 00000000..d42a4ede --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/main.cpp @@ -0,0 +1,595 @@ +/* +** enc_vorbis: main.cpp - Ogg Vorbis encoder plug-in +** +** Copyright (C) 2001-2012 Nullsoft, Inc. +** +** This software is provided 'as-is', without any express or implied warranty. +** In no event will the authors be held liable for any damages arising from the use of this software. +** +** Permission is granted to anyone to use this software for any purpose, including commercial +** applications, and to alter it and redistribute it freely, subject to the following restrictions: +** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the +** original software. If you use this software in a product, an acknowledgment in the product +** documentation would be appreciated but is not required. +** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as +** being the original software. +** 3. This notice may not be removed or altered from any source distribution. +*/ + +#define ENC_VERSION "v1.58" + +#include <windows.h> +#include <commctrl.h> +#include <uxtheme.h> +#include <strsafe.h> +#include "resource.h" +#include "../nsv/enc_if.h" +#include <vorbis/vorbisenc.h> + +// wasabi based services for localisation support +#include <api/service/waServiceFactory.h> +#include "../Agave/Language/api_language.h" +#include <api/application/api_application.h> +#include "../winamp/wa_ipc.h" + +HWND winampwnd = 0; +int isthemethere = 0; +api_service *WASABI_API_SVC = 0; +api_application *WASABI_API_APP = 0; +api_language *WASABI_API_LNG = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + return TRUE; +} + +typedef struct +{ + bool cfg_abr_use_max,cfg_abr_use_min; + UINT cfg_mode; + + float cfg_vbrquality; + UINT cfg_abr_nominal; + UINT cfg_abr_max; + UINT cfg_abr_min; +} configtype; + +typedef struct +{ + configtype cfg; + char *configfile; +} +configwndrec; + +void readconfig(char *configfile, configtype *cfg) +{ + cfg->cfg_abr_use_max=0; + cfg->cfg_abr_use_min=0; + cfg->cfg_mode=0; //VBR + + cfg->cfg_vbrquality=0.4f; + + cfg->cfg_abr_nominal=160; + cfg->cfg_abr_max=352; + cfg->cfg_abr_min=32; + + if (configfile) GetPrivateProfileStructA("audio_ogg","conf",cfg,sizeof(configtype),configfile); + cfg->cfg_mode=0; // VBR, fuckers. +} + +void writeconfig(char *configfile, configtype *cfg) +{ + if (configfile) WritePrivateProfileStructA("audio_ogg","conf",cfg,sizeof(configtype),configfile); +} + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if(!WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if(!WASABI_API_APP) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid); + if (sf) WASABI_API_APP = reinterpret_cast<api_application*>(sf->getInterface()); + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf; + sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncVorbisLangGUID); + } +} + +class AudioCoderOgg : public AudioCoder +{ + public: + AudioCoderOgg(int nch, int srate, int bps, configtype *cfg); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); + ~AudioCoderOgg() + { + ogg_stream_clear(&os); + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + vorbis_comment_clear(&vc); + vorbis_info_clear(&vi); + } + int GetLastError() { return m_err; }; + private: + int m_err; + int m_bps, m_nch; + + ogg_stream_state os; /* take physical pages, weld into a logical stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + vorbis_info vi; /* struct that stores all the static vorbis bitstream settings */ + vorbis_comment vc; /* struct that stores all the user comments */ + + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + int m_inbuf; +}; + +int AudioCoderOgg::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (m_err) return -1; + *in_used = 0; //only necessary for flawed impl that dont reset this to zero each time (BAD rOn) + + int wrote=0; + char *dest = (char*)out; + + if (!in_avail && !framepos) + { + vorbis_analysis_wrote(&vd,0); + } + + for (;;) + { + /* vorbis does some data preanalysis, then divvies up blocks for + more involved (potentially parallel) processing. Get a single + block for encoding now */ + + while (m_inbuf || vorbis_analysis_blockout(&vd,&vb)==1) + { + /* analysis */ + if (!m_inbuf) + { + vorbis_analysis(&vb,&op); + vorbis_bitrate_addblock(&vb); + } + + while (m_inbuf || vorbis_bitrate_flushpacket(&vd, &op)) + { + /* weld the packet into the bitstream */ + if (!m_inbuf) ogg_stream_packetin(&os,&op); + + /* write out pages (if any) */ + while (m_inbuf || ogg_stream_pageout(&os,&og)) + { + int l=og.header_len+og.body_len; + if(out_avail<l) + { + m_inbuf=1; + return wrote; + } + memcpy(dest,og.header,og.header_len); + memcpy(dest+og.header_len,og.body,og.body_len); + dest+=l; + wrote+=l; + out_avail-=l; + m_inbuf=0; + + if (ogg_page_eos(&og)) break; + } + } + } + + // if we used all our samples, or had output, flush it + if (*in_used >= in_avail || wrote) return wrote; + + // bring in more pcm samples + if (in_avail > *in_used) + { + UINT i; + int c; + int bytes=in_avail-*in_used; + void *buf=(char*)in + *in_used; + + if (bytes > 1024) bytes=1024; + + *in_used+=bytes; + + UINT nsam=bytes/((m_bps>>3)*m_nch); + float **buffer=vorbis_analysis_buffer(&vd,nsam); + switch(m_bps) + { + case 8: + { + BYTE* rbuf=(BYTE*)buf; + for(i=0;i<nsam;i++) + { + for(c=0;c<m_nch;c++) + { + buffer[c][i]=((float)(UINT)*rbuf)/128.f-1.f; + rbuf++; + } + } + } + break; + case 16: + { + short* rbuf=(short*)buf; + for(i=0;i<nsam;i++) + { + for(c=0;c<m_nch;c++) + { + buffer[c][i]=(float)*rbuf/32768.f; + rbuf++; + } + } + } + break; + case 24: + { + char* rbuf=(char*)buf; + for(i=0;i<nsam;i++) + { + for(c=0;c<m_nch;c++) + { + BYTE* b=(BYTE*)rbuf; + long val = b[0] | (b[1]<<8) | (b[2]<<16); + if (val&0x800000) val|=0xFF000000; + buffer[c][i]=(float)((double)val/(double)0x800000); + rbuf+=3; + } + } + } + break; + case 32: + { + long* rbuf=(long*)buf; + for(i=0;i<nsam;i++) + { + for(c=0;c<m_nch;c++) + { + buffer[c][i]=(float)((double)rbuf[i*m_nch+c]/(double)0x80000000); + } + } + } + break; + } + + /* tell the library how much we actually submitted */ + vorbis_analysis_wrote(&vd,nsam); + } + } +} + +AudioCoderOgg::AudioCoderOgg(int nch, int srate, int bps, configtype *cfg) +{ + m_err=0; + + m_bps=bps; + m_nch=nch; + m_inbuf=0; + + int poo; + + vorbis_info_init(&vi); + if (cfg->cfg_mode==0) poo=vorbis_encode_init_vbr(&vi,nch,srate,cfg->cfg_vbrquality); + else + { + UINT nominal,min,max; + if (cfg->cfg_mode==1) + {//abr + nominal=cfg->cfg_abr_nominal * 1000; + min=cfg->cfg_abr_use_min ? cfg->cfg_abr_min * 1000: -1; + max=cfg->cfg_abr_use_max ? cfg->cfg_abr_max * 1000: -1; + } + else//cbr + { + nominal=min=max=cfg->cfg_abr_nominal*1000; + } + poo=vorbis_encode_init(&vi,nch,srate,max,nominal,min); + } + + if (poo) + { + vorbis_info_clear(&vi); + m_err++; + return; + } + + vorbis_comment_init(&vc); + vorbis_comment_add(&vc, "ENCODEDBY=Winamp"); + + /* set up the analysis state and auxiliary encoding storage */ + vorbis_analysis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + + /* set up our packet->stream encoder */ + /* pick a random serial number; that way we can more likely build + chained streams just by concatenation */ + + ogg_stream_init(&os,GetTickCount()^(GetTickCount()<<16));//fixme : rand + + /* Vorbis streams begin with three headers; the initial header (with + most of the codec setup parameters) which is mandated by the Ogg + bitstream spec. The second header holds any comment fields. The + third header holds the bitstream codebook. We merely need to + make the headers, then pass them to libvorbis one at a time; + libvorbis handles the additional Ogg bitstream constraints */ + + { + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code); + ogg_stream_packetin(&os,&header); /* automatically placed in its own page */ + ogg_stream_packetin(&os,&header_comm); + ogg_stream_packetin(&os,&header_code); + } +} + +extern "C" +{ + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + if (idx==0) + { + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, "%s %s (aoTuV b6.03)", WASABI_API_LNGSTRING(IDS_ENC_VORBIS_DESC), ENC_VERSION); + return mmioFOURCC('O','G','G',' '); + } + return 0; + } + + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (srct == mmioFOURCC('P','C','M',' ') && *outt == mmioFOURCC('O','G','G',' ')) + { + configtype cfg; + readconfig(configfile,&cfg); + AudioCoderOgg *t = new AudioCoderOgg(nch,srate,bps,&cfg); + if (t->GetLastError()) + { + delete t; + return NULL; + } + return t; + } + return NULL; + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + } + + #define doshow(x,y) ShowWindow(x,(y)?SW_SHOWNA:SW_HIDE) + + static HCURSOR link_hand_cursor; + LRESULT link_handlecursor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + LRESULT ret = CallWindowProcW((WNDPROC)GetPropW(hwndDlg, L"link_proc"), hwndDlg, uMsg, wParam, lParam); + // override the normal cursor behaviour so we have a hand to show it is a link + if(uMsg == WM_SETCURSOR) + { + if((HWND)wParam == hwndDlg) + { + if(!link_hand_cursor) + { + link_hand_cursor = LoadCursor(NULL, IDC_HAND); + } + SetCursor(link_hand_cursor); + return TRUE; + } + } + return ret; + } + + void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + if (uMsg == WM_DRAWITEM) + { + DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam; + if (di->CtlType == ODT_BUTTON) + { + wchar_t wt[123] = {0}; + int y; + RECT r; + HPEN hPen, hOldPen; + GetDlgItemTextW(hwndDlg, (int)wParam, wt, sizeof(wt)/sizeof(wt[0])); + + // due to the fun of theming and owner drawing we have to get the background colour + if(isthemethere){ + HTHEME hTheme = OpenThemeData(hwndDlg, L"Tab"); + if (hTheme) { + DrawThemeParentBackground(di->hwndItem, di->hDC, &di->rcItem); + CloseThemeData(hTheme); + } + } + + // draw text + SetTextColor(di->hDC, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + r = di->rcItem; + r.left += 2; + DrawTextW(di->hDC, wt, -1, &r, DT_VCENTER | DT_SINGLELINE); + + memset(&r, 0, sizeof(r)); + DrawTextW(di->hDC, wt, -1, &r, DT_SINGLELINE | DT_CALCRECT); + + // draw underline + y = di->rcItem.bottom - ((di->rcItem.bottom - di->rcItem.top) - (r.bottom - r.top)) / 2 - 1; + hPen = CreatePen(PS_SOLID, 0, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); + hOldPen = (HPEN) SelectObject(di->hDC, hPen); + MoveToEx(di->hDC, di->rcItem.left + 2, y, NULL); + LineTo(di->hDC, di->rcItem.right + 2 - ((di->rcItem.right - di->rcItem.left) - (r.right - r.left)), y); + SelectObject(di->hDC, hOldPen); + DeleteObject(hPen); + } + } + } + + void link_startsubclass(HWND hwndDlg, UINT id) + { + HWND ctrl = GetDlgItem(hwndDlg, id); + if(!GetPropW(ctrl, L"link_proc")) + { + SetPropW(ctrl, L"link_proc", + (HANDLE)SetWindowLongPtrW(ctrl, GWLP_WNDPROC, (LONG_PTR)link_handlecursor)); + } + } + + BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) + { + if (uMsg == WM_USER+667) + { + int p=(int)SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_GETPOS,0,0)-10; + char tmp[512] = {0}; + double dispVal = ((double)p)/10; + vorbis_info vi = {0}; + int br = 128; + + vorbis_info_init(&vi); + if(vorbis_encode_init_vbr(&vi, 2, 44100, (float) (p / 100.0))) + br=128; // Mode setup failed: go with a default. + else + { + br = vi.bitrate_nominal / 1000; + vorbis_info_clear(&vi); + } + + StringCchPrintfA(tmp, 512, WASABI_API_LNGSTRING(IDS_QUALITY_FACTOR_F_KBPS), dispVal, br); + + SetDlgItemTextA(hwndDlg,IDC_VBRVAL,tmp); + + link_startsubclass(hwndDlg, IDC_URL1); + link_startsubclass(hwndDlg, IDC_URL2); + } + + else if (uMsg == WM_INITDIALOG) + { +#if defined (_WIN64) + SetWindowLong(hwndDlg,GWLP_USERDATA,(LONG)lParam); +#else + SetWindowLong(hwndDlg, GWL_USERDATA, lParam); +#endif + if (lParam) + { + configwndrec *wc=(configwndrec*)lParam; + SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_SETRANGE,0,MAKELONG(0,110)); + SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_SETTICFREQ,5,0); + SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_SETPAGESIZE,0,10); + SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_SETPOS,TRUE,(int)(wc->cfg.cfg_vbrquality*100.0f + (wc->cfg.cfg_vbrquality < 0.0 ? - 0.5f : 0.5f)) + 10); + SendMessage(hwndDlg,WM_USER+667,0,0); + } + } + + else if (uMsg == WM_HSCROLL) + { + HWND swnd = (HWND) lParam; + if (swnd == GetDlgItem(hwndDlg, IDC_VBRQUALITY)) + { + int p=(int)SendDlgItemMessage(hwndDlg,IDC_VBRQUALITY,TBM_GETPOS,0,0)-10; + +#if defined (_WIN64) + configwndrec* wc = (configwndrec*)GetWindowLong(hwndDlg, GWLP_USERDATA); +#else + configwndrec* wc = (configwndrec*)GetWindowLong(hwndDlg, GWL_USERDATA); +#endif + if (wc) + { + wc->cfg.cfg_vbrquality=(float)p/100.0f; + } + SendMessage(hwndDlg,WM_USER+667,0,0); + } + } + + else if (uMsg == WM_COMMAND) + { + if(LOWORD(wParam) == IDC_URL1) + { + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"http://xiph.org/vorbis/", IPC_OPEN_URL); + } + else if(LOWORD(wParam) == IDC_URL2) + { + SendMessage(winampwnd, WM_WA_IPC, (WPARAM)"https://ao-yumi.github.io/aotuv_web/index.html", IPC_OPEN_URL); + } + } + + else if (uMsg == WM_DESTROY) + { +#if defined (_WIN64) + configwndrec* wc = (configwndrec*)SetWindowLong(hwndDlg, GWLP_USERDATA, 0); +#else + configwndrec* wc = (configwndrec*)SetWindowLong(hwndDlg, GWL_USERDATA, 0); +#endif + if (wc) + { + wc->cfg.cfg_mode=0; + writeconfig(wc->configfile,&wc->cfg); + free(wc->configfile); + free(wc); + } + } + + const int controls[] = + { + IDC_VBRQUALITY, + }; + if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE(controls))) + { + return TRUE; + } + + link_handledraw(hwndDlg, uMsg, wParam, lParam); + return 0; + } + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, char *configfile) + { + if (outt == mmioFOURCC('O','G','G',' ')) + { + configwndrec *wr=(configwndrec*)malloc(sizeof(configwndrec)); + if (configfile) wr->configfile=_strdup(configfile); + else wr->configfile=0; + + readconfig(configfile,&wr->cfg); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_CONFIG,hwndParent,DlgProc,(LPARAM)wr); + } + return NULL; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + isthemethere = !SendMessage(hwnd,WM_WA_IPC,IPC_ISWINTHEMEPRESENT,IPC_USE_UXTHEME_FUNC); + } +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/config_types.h b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/config_types.h new file mode 100644 index 00000000..750e29dd --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/config_types.h @@ -0,0 +1,25 @@ +#ifndef __CONFIG_TYPES_H__ +#define __CONFIG_TYPES_H__ + +/* these are filled in by configure */ +#define INCLUDE_INTTYPES_H @INCLUDE_INTTYPES_H@ +#define INCLUDE_STDINT_H @INCLUDE_STDINT_H@ +#define INCLUDE_SYS_TYPES_H @INCLUDE_SYS_TYPES_H@ + +#if INCLUDE_INTTYPES_H +# include <inttypes.h> +#endif +#if INCLUDE_STDINT_H +# include <stdint.h> +#endif +#if INCLUDE_SYS_TYPES_H +# include <sys/types.h> +#endif + +typedef @SIZE16@ ogg_int16_t; +typedef @USIZE16@ ogg_uint16_t; +typedef @SIZE32@ ogg_int32_t; +typedef @USIZE32@ ogg_uint32_t; +typedef @SIZE64@ ogg_int64_t; + +#endif diff --git a/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/ogg.h b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/ogg.h new file mode 100644 index 00000000..7609fc24 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/ogg.h @@ -0,0 +1,210 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel libogg include + last mod: $Id$ + + ********************************************************************/ +#ifndef _OGG_H +#define _OGG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stddef.h> +#include <ogg/os_types.h> + +typedef struct { + void *iov_base; + size_t iov_len; +} ogg_iovec_t; + +typedef struct { + long endbyte; + int endbit; + + unsigned char *buffer; + unsigned char *ptr; + long storage; +} oggpack_buffer; + +/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/ + +typedef struct { + unsigned char *header; + long header_len; + unsigned char *body; + long body_len; +} ogg_page; + +/* ogg_stream_state contains the current encode/decode state of a logical + Ogg bitstream **********************************************************/ + +typedef struct { + unsigned char *body_data; /* bytes from packet bodies */ + long body_storage; /* storage elements allocated */ + long body_fill; /* elements stored; fill mark */ + long body_returned; /* elements of fill returned */ + + + int *lacing_vals; /* The values that will go to the segment table */ + ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact + this way, but it is simple coupled to the + lacing fifo */ + long lacing_storage; + long lacing_fill; + long lacing_packet; + long lacing_returned; + + unsigned char header[282]; /* working space for header encode */ + int header_fill; + + int e_o_s; /* set when we have buffered the last packet in the + logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + +} ogg_stream_state; + +/* ogg_packet is used to encapsulate the data and metadata belonging + to a single raw Ogg/Vorbis packet *************************************/ + +typedef struct { + unsigned char *packet; + long bytes; + long b_o_s; + long e_o_s; + + ogg_int64_t granulepos; + + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ +} ogg_packet; + +typedef struct { + unsigned char *data; + int storage; + int fill; + int returned; + + int unsynced; + int headerbytes; + int bodybytes; +} ogg_sync_state; + +/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + +extern void oggpack_writeinit(oggpack_buffer *b); +extern int oggpack_writecheck(oggpack_buffer *b); +extern void oggpack_writetrunc(oggpack_buffer *b,long bits); +extern void oggpack_writealign(oggpack_buffer *b); +extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpack_reset(oggpack_buffer *b); +extern void oggpack_writeclear(oggpack_buffer *b); +extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpack_look(oggpack_buffer *b,int bits); +extern long oggpack_look1(oggpack_buffer *b); +extern void oggpack_adv(oggpack_buffer *b,int bits); +extern void oggpack_adv1(oggpack_buffer *b); +extern long oggpack_read(oggpack_buffer *b,int bits); +extern long oggpack_read1(oggpack_buffer *b); +extern long oggpack_bytes(oggpack_buffer *b); +extern long oggpack_bits(oggpack_buffer *b); +extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); + +extern void oggpackB_writeinit(oggpack_buffer *b); +extern int oggpackB_writecheck(oggpack_buffer *b); +extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); +extern void oggpackB_writealign(oggpack_buffer *b); +extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpackB_reset(oggpack_buffer *b); +extern void oggpackB_writeclear(oggpack_buffer *b); +extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpackB_look(oggpack_buffer *b,int bits); +extern long oggpackB_look1(oggpack_buffer *b); +extern void oggpackB_adv(oggpack_buffer *b,int bits); +extern void oggpackB_adv1(oggpack_buffer *b); +extern long oggpackB_read(oggpack_buffer *b,int bits); +extern long oggpackB_read1(oggpack_buffer *b); +extern long oggpackB_bytes(oggpack_buffer *b); +extern long oggpackB_bits(oggpack_buffer *b); +extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); + +/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ + +extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, + int count, long e_o_s, ogg_int64_t granulepos); +extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); +extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill); + +/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + +extern int ogg_sync_init(ogg_sync_state *oy); +extern int ogg_sync_clear(ogg_sync_state *oy); +extern int ogg_sync_reset(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_check(ogg_sync_state *oy); + +extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); +extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); +extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + +/* Ogg BITSTREAM PRIMITIVES: general ***************************/ + +extern int ogg_stream_init(ogg_stream_state *os,int serialno); +extern int ogg_stream_clear(ogg_stream_state *os); +extern int ogg_stream_reset(ogg_stream_state *os); +extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); +extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_check(ogg_stream_state *os); +extern int ogg_stream_eos(ogg_stream_state *os); + +extern void ogg_page_checksum_set(ogg_page *og); + +extern int ogg_page_version(const ogg_page *og); +extern int ogg_page_continued(const ogg_page *og); +extern int ogg_page_bos(const ogg_page *og); +extern int ogg_page_eos(const ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); +extern int ogg_page_serialno(const ogg_page *og); +extern long ogg_page_pageno(const ogg_page *og); +extern int ogg_page_packets(const ogg_page *og); + +extern void ogg_packet_clear(ogg_packet *op); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OGG_H */ diff --git a/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/os_types.h b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/os_types.h new file mode 100644 index 00000000..b8f56308 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/ogg/include/ogg/os_types.h @@ -0,0 +1,148 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id$ + + ********************************************************************/ +#ifndef _OS_TYPES_H +#define _OS_TYPES_H + +/* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ +#define _ogg_malloc malloc +#define _ogg_calloc calloc +#define _ogg_realloc realloc +#define _ogg_free free + +#if defined(_WIN32) + +# if defined(__CYGWIN__) +# include <stdint.h> + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; +# elif defined(__MINGW32__) +# include <sys/types.h> + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + typedef unsigned long long ogg_uint64_t; +# elif defined(__MWERKS__) + typedef long long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; +# else +# if defined(_MSC_VER) && (_MSC_VER >= 1800) /* MSVC 2013 and newer */ +# include <stdint.h> + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; +# else + /* MSVC/Borland */ + typedef __int64 ogg_int64_t; + typedef __int32 ogg_int32_t; + typedef unsigned __int32 ogg_uint32_t; + typedef __int16 ogg_int16_t; + typedef unsigned __int16 ogg_uint16_t; +# endif +# endif + +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ + +# include <inttypes.h> + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined(__HAIKU__) + + /* Haiku */ +# include <sys/types.h> + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined(__BEOS__) + + /* Be */ +# include <inttypes.h> + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short ogg_int16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined(R5900) + + /* PS2 EE */ + typedef long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned ogg_uint32_t; + typedef short ogg_int16_t; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#elif defined(__TMS320C6X__) + + /* TI C64x compiler */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#else + +# include <ogg/config_types.h> + +#endif + +#endif /* _OS_TYPES_H */ diff --git a/Src/Plugins/Encoder/enc_vorbis/resource.h b/Src/Plugins/Encoder/enc_vorbis/resource.h new file mode 100644 index 00000000..21379029 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/resource.h @@ -0,0 +1,51 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by enc_vorbis.rc +// +#define IDS_QUALITY_FACTOR_F 0 +#define IDS_ENC_VORBIS_DESC 1 +#define IDS_QUALITY_FACTOR_F_KBPS 2 +#define IDD_CONFIG 103 +#define IDC_BITRATE 1000 +#define IDC_VBR 1001 +#define IDC_QUALITY 1002 +#define IDC_JSTEREO1 1003 +#define IDC_JSTEREO2 1004 +#define IDC_BITRATE_TEXT1 1004 +#define IDC_MAXBITRATE 1005 +#define IDC_MINBITRATE 1005 +#define IDC_BITRATE_TEXT2 1006 +#define IDC_MAXBITRATE_TEXT1 1007 +#define IDC_MINBITRATE_TEXT1 1007 +#define IDC_MAXBITRATE_TEXT2 1008 +#define IDC_MINBITRATE_TEXT2 1008 +#define IDC_VBRMETHOD 1009 +#define IDC_AVGBITRATE_TEXT1 1010 +#define IDC_MAXBITRATE2_TEXT1 1010 +#define IDC_AVGBITRATE 1011 +#define IDC_MAXBITRATE2 1011 +#define IDC_AVGBITRATE_TEXT2 1012 +#define IDC_MAXBITRATE2_TEXT2 1012 +#define IDC_STEREOMODE 1013 +#define IDC_VBRQ_TEXT 1014 +#define IDC_VBRQ 1015 +#define IDC_VBRVAL 1016 +#define IDC_VBRTEXT 1017 +#define IDC_VBRQUALITY 1018 +#define IDC_MINBITRATE_CHECK 1019 +#define IDC_MAXBITRATE_CHECK 1020 +#define IDC_VBR1 1023 +#define IDC_VBR2 1024 +#define IDC_URL1 1026 +#define IDC_URL2 1027 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1028 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_vorbis/version.rc2 b/Src/Plugins/Encoder/enc_vorbis/version.rc2 new file mode 100644 index 00000000..0361dd38 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,58,0,0 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "1,58,0,0" + VALUE "InternalName", "Nullsoft Ogg Vorbis Encoder" + VALUE "LegalCopyright", "Copyright © 2006-2023 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_vorbis.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/codec.h b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/codec.h new file mode 100644 index 00000000..a29a5df4 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/codec.h @@ -0,0 +1,243 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + + ******************************************************************** + + function: libvorbis codec headers + last mod: $Id: codec.h,v 1.1 2010/11/09 22:53:50 dromagod Exp $ + + ********************************************************************/ + +#ifndef _vorbis_codec_h_ +#define _vorbis_codec_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include <ogg/ogg.h> + +typedef struct vorbis_info{ + int version; + int channels; + long rate; + + /* The below bitrate declarations are *hints*. + Combinations of the three values carry the following implications: + + all three set to the same value: + implies a fixed rate bitstream + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard + upper/lower limit + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal + may also be set to give a nominal rate. + none set: + the coder does not care to speculate. + */ + + long bitrate_upper; + long bitrate_nominal; + long bitrate_lower; + long bitrate_window; + + void *codec_setup; +} vorbis_info; + +/* vorbis_dsp_state buffers the current vorbis audio + analysis/synthesis state. The DSP state belongs to a specific + logical bitstream ****************************************************/ +typedef struct vorbis_dsp_state{ + int analysisp; + vorbis_info *vi; + + float **pcm; + float **pcmret; + int pcm_storage; + int pcm_current; + int pcm_returned; + + int preextrapolate; + int eofflag; + + long lW; + long W; + long nW; + long centerW; + + ogg_int64_t granulepos; + ogg_int64_t sequence; + + ogg_int64_t glue_bits; + ogg_int64_t time_bits; + ogg_int64_t floor_bits; + ogg_int64_t res_bits; + + void *backend_state; +} vorbis_dsp_state; + +typedef struct vorbis_block{ + /* necessary stream state for linking to the framing abstraction */ + float **pcm; /* this is a pointer into local storage */ + oggpack_buffer opb; + + long lW; + long W; + long nW; + int pcmend; + int mode; + + int eofflag; + ogg_int64_t granulepos; + ogg_int64_t sequence; + vorbis_dsp_state *vd; /* For read-only access of configuration */ + + /* local storage to avoid remallocing; it's up to the mapping to + structure it */ + void *localstore; + long localtop; + long localalloc; + long totaluse; + struct alloc_chain *reap; + + /* bitmetrics for the frame */ + long glue_bits; + long time_bits; + long floor_bits; + long res_bits; + + void *internal; + +} vorbis_block; + +/* vorbis_block is a single block of data to be processed as part of +the analysis/synthesis stream; it belongs to a specific logical +bitstream, but is independant from other vorbis_blocks belonging to +that logical bitstream. *************************************************/ + +struct alloc_chain{ + void *ptr; + struct alloc_chain *next; +}; + +/* vorbis_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). vorbis_info and substructures are in backends.h. +*********************************************************************/ + +/* the comments are not part of vorbis_info so that vorbis_info can be + static storage */ +typedef struct vorbis_comment{ + /* unlimited user comment fields. libvorbis writes 'libvorbis' + whatever vendor is set to in encode */ + char **user_comments; + int *comment_lengths; + int comments; + char *vendor; + +} vorbis_comment; + + +/* libvorbis encodes in two abstraction layers; first we perform DSP + and produce a packet (see docs/analysis.txt). The packet is then + coded into a framed OggSquish bitstream by the second layer (see + docs/framing.txt). Decode is the reverse process; we sync/frame + the bitstream and extract individual packets, then decode the + packet back into PCM audio. + + The extra framing/packetizing is used in streaming formats, such as + files. Over the net (such as with UDP), the framing and + packetization aren't necessary as they're provided by the transport + and the streaming layer is not used */ + +/* Vorbis PRIMITIVES: general ***************************************/ + +extern void vorbis_info_init(vorbis_info *vi); +extern void vorbis_info_clear(vorbis_info *vi); +extern int vorbis_info_blocksize(vorbis_info *vi,int zo); +extern void vorbis_comment_init(vorbis_comment *vc); +extern void vorbis_comment_add(vorbis_comment *vc, const char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + const char *tag, const char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag); +extern void vorbis_comment_clear(vorbis_comment *vc); + +extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); +extern int vorbis_block_clear(vorbis_block *vb); +extern void vorbis_dsp_clear(vorbis_dsp_state *v); +extern double vorbis_granule_time(vorbis_dsp_state *v, + ogg_int64_t granulepos); + +extern const char *vorbis_version_string(void); + +/* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ + +extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); +extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); +extern int vorbis_analysis_headerout(vorbis_dsp_state *v, + vorbis_comment *vc, + ogg_packet *op, + ogg_packet *op_comm, + ogg_packet *op_code); +extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); +extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); +extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); +extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); + +extern int vorbis_bitrate_addblock(vorbis_block *vb); +extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, + ogg_packet *op); + +/* Vorbis PRIMITIVES: synthesis layer *******************************/ +extern int vorbis_synthesis_idheader(ogg_packet *op); +extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, + ogg_packet *op); + +extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); +extern int vorbis_synthesis_restart(vorbis_dsp_state *v); +extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); +extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); +extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); +extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); +extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); + +extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); +extern int vorbis_synthesis_halfrate_p(vorbis_info *v); + +/* Vorbis ERRORS and return codes ***********************************/ + +#define OV_FALSE -1 +#define OV_EOF -2 +#define OV_HOLE -3 + +#define OV_EREAD -128 +#define OV_EFAULT -129 +#define OV_EIMPL -130 +#define OV_EINVAL -131 +#define OV_ENOTVORBIS -132 +#define OV_EBADHEADER -133 +#define OV_EVERSION -134 +#define OV_ENOTAUDIO -135 +#define OV_EBADPACKET -136 +#define OV_EBADLINK -137 +#define OV_ENOSEEK -138 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisenc.h b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisenc.h new file mode 100644 index 00000000..a0a4e757 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisenc.h @@ -0,0 +1,112 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: vorbis encode-engine setup + last mod: $Id: vorbisenc.h,v 1.1 2010/11/09 22:53:50 dromagod Exp $ + + ********************************************************************/ + +#ifndef _OV_ENC_H_ +#define _OV_ENC_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include "codec.h" + +extern int vorbis_encode_init(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +extern int vorbis_encode_setup_managed(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +extern int vorbis_encode_setup_vbr(vorbis_info *vi, + long channels, + long rate, + + float quality /* quality level from 0. (lo) to 1. (hi) */ + ); + +extern int vorbis_encode_init_vbr(vorbis_info *vi, + long channels, + long rate, + + float base_quality /* quality level from 0. (lo) to 1. (hi) */ + ); + +extern int vorbis_encode_setup_init(vorbis_info *vi); + +extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); + + /* deprecated rate management supported only for compatability */ +#define OV_ECTL_RATEMANAGE_GET 0x10 +#define OV_ECTL_RATEMANAGE_SET 0x11 +#define OV_ECTL_RATEMANAGE_AVG 0x12 +#define OV_ECTL_RATEMANAGE_HARD 0x13 + +struct ovectl_ratemanage_arg { + int management_active; + + long bitrate_hard_min; + long bitrate_hard_max; + double bitrate_hard_window; + + long bitrate_av_lo; + long bitrate_av_hi; + double bitrate_av_window; + double bitrate_av_window_center; +}; + + + /* new rate setup */ +#define OV_ECTL_RATEMANAGE2_GET 0x14 +#define OV_ECTL_RATEMANAGE2_SET 0x15 + +struct ovectl_ratemanage2_arg { + int management_active; + + long bitrate_limit_min_kbps; + long bitrate_limit_max_kbps; + long bitrate_limit_reservoir_bits; + double bitrate_limit_reservoir_bias; + + long bitrate_average_kbps; + double bitrate_average_damping; +}; + + + +#define OV_ECTL_LOWPASS_GET 0x20 +#define OV_ECTL_LOWPASS_SET 0x21 + +#define OV_ECTL_IBLOCK_GET 0x30 +#define OV_ECTL_IBLOCK_SET 0x31 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + + diff --git a/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisfile.h b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisfile.h new file mode 100644 index 00000000..d64fb824 --- /dev/null +++ b/Src/Plugins/Encoder/enc_vorbis/vorbis/include/vorbis/vorbisfile.h @@ -0,0 +1,201 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + last mod: $Id: vorbisfile.h,v 1.1 2010/11/09 22:53:50 dromagod Exp $ + + ********************************************************************/ + +#ifndef _OV_FILE_H_ +#define _OV_FILE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include <stdio.h> +#include "codec.h" + +/* The function prototypes for the callbacks are basically the same as for + * the stdio functions fread, fseek, fclose, ftell. + * The one difference is that the FILE * arguments have been replaced with + * a void * - this is to be used as a pointer to whatever internal data these + * functions might need. In the stdio case, it's just a FILE * cast to a void * + * + * If you use other functions, check the docs for these functions and return + * the right values. For seek_func(), you *MUST* return -1 if the stream is + * unseekable + */ +typedef struct { + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); +} ov_callbacks; + +/* a few sets of convenient callbacks, especially for use under + * Windows where ov_open_callbacks() should always be used instead of + * ov_open() to avoid problems with incompatable crt.o version linking + * issues. */ + +static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + +#ifdef __MINGW32__ + return fseeko64(f,off,whence); +#elif defined (_WIN32) + return _fseeki64(f,off,whence); +#else + return fseek(f,off,whence); +#endif +} + +/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as + * static data. That means that every file which includes this header + * will get its own copy of these structs whether it uses them or + * not. This is essential on platforms such as Windows on which + * several different versions of stdio support may be linked to by + * different DLLs, and we need to be certain we know which one we're + * using (the same one as the main application). + */ + +static ov_callbacks OV_CALLBACKS_DEFAULT = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) NULL, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) fclose, + (long (*)(void *)) NULL +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) NULL, + (long (*)(void *)) NULL +}; + +#define NOTOPEN 0 +#define PARTOPEN 1 +#define OPENED 2 +#define STREAMSET 3 +#define INITSET 4 + +typedef struct OggVorbis_File { + void *datasource; /* Pointer to a FILE *, etc. */ + int seekable; + ogg_int64_t offset; + ogg_int64_t end; + ogg_sync_state oy; + + /* If the FILE handle isn't seekable (eg, a pipe), only the current + stream appears */ + int links; + ogg_int64_t *offsets; + ogg_int64_t *dataoffsets; + long *serialnos; + ogg_int64_t *pcmlengths; /* overloaded to maintain binary + compatability; x2 size, stores both + beginning and end values */ + vorbis_info *vi; + vorbis_comment *vc; + + /* Decoding working state local storage */ + ogg_int64_t pcm_offset; + int ready_state; + long current_serialno; + int current_link; + + double bittrack; + double samptrack; + + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + ov_callbacks callbacks; + +} OggVorbis_File; + + +extern int ov_clear(OggVorbis_File *vf); +extern int ov_fopen(char *path,OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); +extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, + char *initial, long ibytes, ov_callbacks callbacks); +extern int ov_test_open(OggVorbis_File *vf); + +extern long ov_bitrate(OggVorbis_File *vf,int i); +extern long ov_bitrate_instant(OggVorbis_File *vf); +extern long ov_streams(OggVorbis_File *vf); +extern long ov_seekable(OggVorbis_File *vf); +extern long ov_serialnumber(OggVorbis_File *vf,int i); + +extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); +extern double ov_time_total(OggVorbis_File *vf,int i); + +extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page(OggVorbis_File *vf,double pos); + +extern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek_lap(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos); + +extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); +extern double ov_time_tell(OggVorbis_File *vf); + +extern vorbis_info *ov_info(OggVorbis_File *vf,int link); +extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); + +extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, + int *bitstream); +extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream, + void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); +extern long ov_read(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream); +extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); + +extern int ov_halfrate(OggVorbis_File *vf,int flag); +extern int ov_halfrate_p(OggVorbis_File *vf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/Src/Plugins/Encoder/enc_wav/ACMEncoder.cpp b/Src/Plugins/Encoder/enc_wav/ACMEncoder.cpp new file mode 100644 index 00000000..bbdda7b7 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/ACMEncoder.cpp @@ -0,0 +1,265 @@ +#include "ACMEncoder.h" + +#define rev32(X) ((((DWORD)(X)&0xFF)<<24)|(((DWORD)(X)&0xFF00)<<8)|(((DWORD)(X)&0xFF0000)>>8)|(((DWORD)(X)&0xFF000000)>>24)) + +static DWORD FileTell(HANDLE hFile) +{ + return SetFilePointer(hFile, 0, 0, FILE_CURRENT); +} +static void FileAlign(HANDLE hFile) +{ + if (FileTell(hFile)&1) SetFilePointer(hFile, 1, 0, FILE_CURRENT); +} + +#define BUFSIZE 0x20000 + +ACMEncoder::ACMEncoder(int srate, int nch, int bps, ACMConfig *config) +{ + m_did_header = 0; + m_srate = srate; + m_nch = nch; + m_bps = bps; + m_error = 0; + hStream = 0; + hStreamResample = 0; + m_acm_resample_buf = NULL; + m_acm_resample_outbuf = NULL; + m_bytes_done = 0; + m_hlen = 0; + m_nsam = 0; + + m_acm_buf = (unsigned char *)malloc(BUFSIZE); + m_acm_outbuf = (unsigned char *)malloc(BUFSIZE); + m_bytes_inbuf = 0; + m_bytes_outbuf = 0; + m_convert_wfx = config->convert_wfx; + do_header = config->header; + + m_wfx_src.wFormatTag = WAVE_FORMAT_PCM; + m_wfx_src.nChannels = nch; + m_wfx_src.nSamplesPerSec = srate; + m_wfx_src.nAvgBytesPerSec = srate * nch * (bps >> 3); + m_wfx_src.nBlockAlign = nch * (bps >> 3); + m_wfx_src.wBitsPerSample = bps; + m_wfx_src.cbSize = 0; + MMRESULT rs = acmStreamOpen(&hStream, 0, &m_wfx_src, &m_convert_wfx.wfx, 0, 0, 0, ACM_STREAMOPENF_NONREALTIME); + if (rs) + { + // need resampling + WAVEFORMATEX wfx1; + ZeroMemory(&wfx1, sizeof(wfx1)); + wfx1.wFormatTag = WAVE_FORMAT_PCM; + if (acmFormatSuggest(0, &m_convert_wfx.wfx, &wfx1, sizeof(WAVEFORMATEX), ACM_FORMATSUGGESTF_WFORMATTAG)) m_error = 1; + else if (acmStreamOpen(&hStream, 0, &wfx1, &m_convert_wfx.wfx, 0, 0, 0, ACM_STREAMOPENF_NONREALTIME)) m_error = 1; + else if (acmStreamOpen(&hStreamResample, 0, &m_wfx_src, &wfx1, 0, 0, 0, ACM_STREAMOPENF_NONREALTIME)) m_error = 1; + else + { + ZeroMemory(&ahdResample, sizeof(ahdResample)); + ahdResample.cbStruct = sizeof(ahdResample); + ahdResample.pbSrc = m_acm_resample_buf = (unsigned char *)malloc(BUFSIZE); + ahdResample.cbSrcLength = BUFSIZE; + ahdResample.pbDst = m_acm_resample_outbuf = (unsigned char *)malloc(BUFSIZE); + ahdResample.cbDstLength = BUFSIZE; + if (acmStreamPrepareHeader(hStreamResample, &ahdResample, 0)) m_error = 1; + m_bytes_inbuf_resample = 0; + m_bytes_outbuf_resample = 0; + } + } + + if (!hStream) + { + m_error = 1; + return ; + } + + ZeroMemory(&ahd, sizeof(ahd)); + ahd.cbStruct = sizeof(ahd); + ahd.pbSrc = m_acm_buf; + ahd.cbSrcLength = BUFSIZE; + ahd.pbDst = m_acm_outbuf; + ahd.cbDstLength = BUFSIZE; + if (acmStreamPrepareHeader(hStream, &ahd, 0)) m_error = 1; +} + +ACMEncoder::~ACMEncoder() +{ + free(m_acm_buf); + free(m_acm_outbuf); + free(m_acm_resample_buf); + free(m_acm_resample_outbuf); + if (hStream) + { + if (ahd.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) acmStreamUnprepareHeader(hStream, &ahd, 0); + acmStreamClose(hStream, 0); + } + if (hStreamResample) + { + if (ahdResample.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) acmStreamUnprepareHeader(hStreamResample, &ahdResample, 0); + acmStreamClose(hStreamResample, 0); + } +} + +int ACMEncoder::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + char *pout = (char *)out; + int retval = 0; + + if (!m_did_header && do_header) + { + int s = 4 + 4 + 12 - 4; + + int t; + if (m_convert_wfx.wfx.wFormatTag == WAVE_FORMAT_PCM) t = 0x10; + else t = sizeof(WAVEFORMATEX) + m_convert_wfx.wfx.cbSize; + s += 4 + t; + if (s&1) s++; + + if (m_convert_wfx.wfx.wFormatTag != WAVE_FORMAT_PCM) + s += 12; + + s += 8; + + if (out_avail < s) return 0; + //xx bytes of randomness + m_hlen = s; + m_did_header = 1; + out_avail -= s; + pout += s; + retval = s; + } + + if (!m_bytes_outbuf) + { + if (hStreamResample) + { + if (!m_bytes_outbuf_resample) + { + DWORD flags = ACM_STREAMCONVERTF_BLOCKALIGN; + + int l = min(in_avail, BUFSIZE - m_bytes_inbuf_resample); + if (l < 0) l = 0; + if (l > 0) memcpy(m_acm_resample_buf + m_bytes_inbuf_resample, in, l); + m_bytes_inbuf_resample += l; + *in_used = l; + m_nsam += l; + + ahdResample.cbSrcLength = m_bytes_inbuf_resample; + acmStreamConvert(hStreamResample, &ahdResample, flags); + m_bytes_inbuf_resample -= ahdResample.cbSrcLengthUsed; + memcpy(m_acm_resample_buf, m_acm_resample_buf + ahdResample.cbSrcLengthUsed, m_bytes_inbuf_resample); //memmove + m_bytes_outbuf_resample = ahdResample.cbDstLengthUsed; + } + in = (void*)m_acm_resample_outbuf; + in_avail = m_bytes_outbuf_resample; + m_bytes_outbuf_resample = 0; + in_used = NULL; + } + + DWORD flags = ACM_STREAMCONVERTF_BLOCKALIGN; + + int l = min(in_avail, BUFSIZE - m_bytes_inbuf); + if (l < 0) l = 0; + if (l > 0) memcpy(m_acm_buf + m_bytes_inbuf, in, l); + m_bytes_inbuf += l; + if (in_used) + { + *in_used = l; + m_nsam += l; + } + + if (m_bytes_inbuf) + { + ahd.cbSrcLength = m_bytes_inbuf; + acmStreamConvert(hStream, &ahd, flags); + m_bytes_inbuf -= ahd.cbSrcLengthUsed; + memcpy(m_acm_buf, m_acm_buf + ahd.cbSrcLengthUsed, m_bytes_inbuf); //memmove + m_bytes_outbuf = ahd.cbDstLengthUsed; + m_bytes_done += l; + } + } + if (m_bytes_outbuf) + { + int l = min(out_avail, m_bytes_outbuf); + memcpy(pout, m_acm_outbuf, l); + m_bytes_outbuf -= l; + memcpy(m_acm_outbuf, m_acm_outbuf + l, m_bytes_outbuf); + retval += l; + } + + return retval; +} + +void ACMEncoder::FinishAudio(const wchar_t *filename) +{ + if (!do_header) return ; + + HANDLE fh = CreateFileW(filename, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if (fh == INVALID_HANDLE_VALUE) + return; + + int len, i; + const unsigned char ispred1[4] = + { + 0x52 , 0x49 , 0x46 , 0x46 + }; + const unsigned char ispred2[12] = + { + 0x57, 0x41 , 0x56 , 0x45 , 0x66 , 0x6d , 0x74 , 0x20 , 0x10 , 0x0 , 0x0 , 0x0 + }; + + len = m_bytes_done; + DWORD a = 0; + + FileAlign(fh); + + SetFilePointer(fh, 0, 0, FILE_BEGIN); + + WriteFile(fh, ispred1, sizeof(ispred1), &a, NULL); + i = len + (m_hlen) - 8; + if (i&1) i++; + a = 0; WriteFile(fh, &i, 4, &a, NULL); + a = 0; WriteFile(fh, ispred2, sizeof(ispred2) - (hStream ? 4 : 0), &a, NULL); + + int t; + if (m_convert_wfx.wfx.wFormatTag == WAVE_FORMAT_PCM) t = 0x10; + else t = sizeof(WAVEFORMATEX) + m_convert_wfx.wfx.cbSize; + a = 0; WriteFile(fh, &t, 4, &a, 0); + a = 0; WriteFile(fh, &m_convert_wfx.wfx, t, &a, 0); + + FileAlign(fh); + + DWORD fact_ofs = 0; + if (m_convert_wfx.wfx.wFormatTag != WAVE_FORMAT_PCM) + { + t = rev32('fact'); + a = 0; WriteFile(fh, &t, 4, &a, 0); + t = 4; + a = 0; WriteFile(fh, &t, 4, &a, 0); + fact_ofs = FileTell(fh); + SetFilePointer(fh, 4, 0, FILE_CURRENT); + } + + t = rev32('data'); + WriteFile(fh, &t, 4, &a, 0); + DWORD data_ofs = FileTell(fh); + + { + DWORD t, bw = 0; + SetFilePointer(fh, 4, 0, FILE_BEGIN); + t = GetFileSize(fh, 0) - 8; + WriteFile(fh, &t, 4, &bw, 0); + DWORD data_size = GetFileSize(fh, 0) - (data_ofs + 4); + SetFilePointer(fh, data_ofs, 0, FILE_BEGIN); + bw = 0; WriteFile(fh, &data_size, 4, &bw, 0); + if (fact_ofs) + { + SetFilePointer(fh, fact_ofs, 0, FILE_BEGIN); + t = m_nsam / ((m_bps >> 3) * m_nch); + WriteFile(fh, &t, 4, &bw, 0); + } + } + + CloseHandle(fh); +} + +int ACMEncoder::GetLastError() { return m_error; }
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/ACMEncoder.h b/Src/Plugins/Encoder/enc_wav/ACMEncoder.h new file mode 100644 index 00000000..deb95968 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/ACMEncoder.h @@ -0,0 +1,47 @@ +#ifndef NULLSOFT_ENC_ACM_ACMENCODER_H +#define NULLSOFT_ENC_ACM_ACMENCODER_H + +#include <windows.h> +#include <mmreg.h> +#include <msacm.h> +#include "../nsv/enc_if.h" +#include "Config.h" +#include "Finisher.h" + +class ACMEncoder : public AudioCommon +{ +public: + ACMEncoder(int srate, int nch, int bps, ACMConfig *config); + virtual ~ACMEncoder(); + + virtual int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); + void FinishAudio(const wchar_t *filename); + + int GetLastError(); + + int m_did_header; + int m_nch, m_srate, m_bps; + int m_bytes_done; + int m_error; + int m_hlen; + int m_nsam; + + EXT_WFX m_convert_wfx; + + WAVEFORMATEX m_wfx_src; + HACMSTREAM hStream, hStreamResample; + + ACMSTREAMHEADER ahd, ahdResample; + + unsigned char *m_acm_buf, *m_acm_outbuf; + int m_bytes_inbuf, m_bytes_outbuf; + unsigned char *m_acm_resample_buf, *m_acm_resample_outbuf; + int m_bytes_inbuf_resample, m_bytes_outbuf_resample; + + bool do_header; + +}; + + + +#endif
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/Config.cpp b/Src/Plugins/Encoder/enc_wav/Config.cpp new file mode 100644 index 00000000..bb7974f9 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/Config.cpp @@ -0,0 +1,110 @@ +#include <windows.h> +#include <mmreg.h> +#include <msacm.h> +#include "Config.h" +#include "resource.h" +#include <strsafe.h> + +static void ACM_gettext(HWND hwndDlg, char* tx) +{ + ConfigWnd *wc = (ConfigWnd *)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + ACMFORMATTAGDETAILSA aftd; + ZeroMemory(&aftd, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + aftd.dwFormatTag = wc->cfg.convert_wfx.wfx.wFormatTag; + if (!acmFormatTagDetailsA(0, &aftd, ACM_FORMATTAGDETAILSF_FORMATTAG)) + { + char* p = aftd.szFormatTag; + while (p && *p) *(tx++) = *(p++); + *(tx++) = 13; + *(tx++) = 10; + } + ACMFORMATDETAILSA afd; + ZeroMemory(&afd, sizeof(afd)); + afd.cbStruct = sizeof(afd); + afd.dwFormatTag = wc->cfg.convert_wfx.wfx.wFormatTag; + afd.pwfx = &wc->cfg.convert_wfx.wfx; + afd.cbwfx = sizeof(wc->cfg.convert_wfx); + if (!acmFormatDetailsA(0, &afd, ACM_FORMATDETAILSF_FORMAT)) + { + char* p = afd.szFormat; + while (p && *p) *(tx++) = *(p++); + } + *tx = 0; +} + +static void ACM_choose(HWND hwndDlg, bool pcm) +{ + ConfigWnd *wc = (ConfigWnd *)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + ACMFORMATCHOOSE afc; + memset(&afc, 0, sizeof(afc)); + afc.cbStruct = sizeof(afc); + afc.fdwStyle = ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT; + afc.pwfx = &wc->cfg.convert_wfx.wfx; + afc.cbwfx = sizeof(wc->cfg.convert_wfx); + + afc.hwndOwner = hwndDlg; + + if (!acmFormatChoose(&afc)) + { + { + char tmp[512]; + StringCchPrintfA(tmp, 512,"%s\x0d\x0a%s", afc.szFormatTag, afc.szFormat); + SetDlgItemTextA(hwndDlg, IDC_FORMAT_DESCRIPTION, tmp); + + StringCchPrintfA(tmp, 512,"%d", wc->cfg.convert_wfx.wfx.cbSize); + WritePrivateProfileStringA("enc_wav","fmtsize", tmp, wc->configfile); + WritePrivateProfileStructA("enc_wav", "fmt", &wc->cfg.convert_wfx, sizeof(wc->cfg.convert_wfx.wfx) + wc->cfg.convert_wfx.wfx.cbSize, wc->configfile); + } + } +} + +INT_PTR WINAPI DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ConfigWnd *wc = (ConfigWnd *)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + switch (uMsg) + { + case WM_INITDIALOG: + { + if (!lParam) // this should NEVER happen + return 0; + + SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG)lParam); + wc=(ConfigWnd*)lParam; + + char tmp[256]; + ACM_gettext(hwndDlg, tmp); + SetDlgItemTextA(hwndDlg, IDC_FORMAT_DESCRIPTION, tmp); + CheckDlgButton(hwndDlg, IDC_HEADER, wc->cfg.header); + CheckDlgButton(hwndDlg, IDC_DO_CONVERT, wc->cfg.convert); + SetDlgItemTextA(hwndDlg, IDC_EXTENSION, wc->cfg.wav_ext); + SendDlgItemMessage(hwndDlg, IDC_EXTENSION, EM_SETLIMITTEXT, 4, 0); + } + break; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_CHOOSE_FORMAT: + ACM_choose(hwndDlg, 0); + break; + case IDC_HEADER: + wc->cfg.header = !!IsDlgButtonChecked(hwndDlg, IDC_HEADER); + WritePrivateProfileStringA("enc_wav", "header", wc->cfg.header?"1":"0", wc->configfile); + break; + case IDC_DO_CONVERT: + wc->cfg.convert = !!IsDlgButtonChecked(hwndDlg, IDC_DO_CONVERT); + WritePrivateProfileStringA("enc_wav", "convert", wc->cfg.convert?"1":"0", wc->configfile); + break; + case IDC_EXTENSION: + if (HIWORD(wParam) == EN_CHANGE) + { + GetDlgItemTextA(hwndDlg, IDC_EXTENSION, wc->cfg.wav_ext, sizeof(wc->cfg.wav_ext)); + WritePrivateProfileStringA("enc_wav", "ext", wc->cfg.wav_ext, wc->configfile); + } + break; + } + break; + + } + return 0; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/Config.h b/Src/Plugins/Encoder/enc_wav/Config.h new file mode 100644 index 00000000..7ca66652 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/Config.h @@ -0,0 +1,31 @@ +#ifndef NULLSOFT_ENC_ACM_CONFIG_H +#define NULLSOFT_ENC_ACM_CONFIG_H + +#include <windows.h> +#include <mmreg.h> +#include <msacm.h> + +#define WFSIZ 0x800 +struct EXT_WFX +{ + WAVEFORMATEX wfx; + BYTE crap[WFSIZ]; +}; + +struct ACMConfig +{ + EXT_WFX convert_wfx; + char wav_ext[32]; + bool header; + bool convert; +}; + +struct ConfigWnd +{ + ACMConfig cfg; + char *configfile; +}; + +INT_PTR WINAPI DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +#endif
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/Finisher.h b/Src/Plugins/Encoder/enc_wav/Finisher.h new file mode 100644 index 00000000..b81435df --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/Finisher.h @@ -0,0 +1,10 @@ +#ifndef NULLSOFT_ENC_WAV_FINISHER_H +#define NULLSOFT_ENC_WAV_FINISHER_H + +class AudioCommon : public AudioCoder +{ +public: + virtual void FinishAudio(const wchar_t *filename)=0; +}; + +#endif diff --git a/Src/Plugins/Encoder/enc_wav/WAVEncoder.cpp b/Src/Plugins/Encoder/enc_wav/WAVEncoder.cpp new file mode 100644 index 00000000..374bbf65 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/WAVEncoder.cpp @@ -0,0 +1,72 @@ +#include "WAVEncoder.h" + +#define rev32(X) ((((DWORD)(X)&0xFF)<<24)|(((DWORD)(X)&0xFF00)<<8)|(((DWORD)(X)&0xFF0000)>>8)|(((DWORD)(X)&0xFF000000)>>24)) + +WAVEncoder::WAVEncoder(int nch, int srate, int bps, ACMConfig *config) +{ + numBytes = 0; + + inputFormat.wFormatTag = WAVE_FORMAT_PCM; + inputFormat.nChannels = nch; + inputFormat.nSamplesPerSec = srate; + inputFormat.nAvgBytesPerSec = srate * nch * (bps >> 3); + inputFormat.nBlockAlign = nch * (bps >> 3); + inputFormat.wBitsPerSample = bps; + inputFormat.cbSize = 0; + + do_header = config->header; + if (do_header) + first = 44; +} + +int WAVEncoder::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + if (first) + { + int valid = min(first, out_avail); + first -= valid; + *in_used = 0; + return valid; + } + + int valid = min(in_avail, out_avail); + + memcpy(out, in, valid); + *in_used = valid; + numBytes += valid; + + return valid; +} + +void WAVEncoder::PrepareToFinish() +{} + +void WAVEncoder::FinishAudio(const wchar_t *filename) +{ + if (!do_header) return; + // open old file + HANDLE tempfile = CreateFileW(filename, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); + + if (tempfile) + { + // rewrite initial 44 bytes + DWORD bw = 0; + unsigned __int32 t; + t = rev32('RIFF'); + WriteFile(tempfile, &t, 4, &bw, 0); // RIFF (4 bytes) + t = (unsigned __int32)numBytes + 36; + bw = 0;WriteFile(tempfile, &t, 4, &bw, 0); // size of chunk (4 bytes) + t = rev32('WAVE'); + bw = 0;WriteFile(tempfile, &t, 4, &bw, 0); // WAVE (4 bytes) + t = rev32('fmt '); + bw = 0;WriteFile(tempfile, &t, 4, &bw, 0);// fmt (4 bytes) + t = 16; + bw = 0;WriteFile(tempfile, &t, 4, &bw, 0);// size of chunk (4 bytes) + bw = 0;WriteFile(tempfile, &inputFormat, 16, &bw, 0); // write WAVEFORMAT out (16 bytes) + t = rev32('data'); + bw = 0;WriteFile(tempfile, &t, 4, &bw, 0);// data (4 bytes) + bw = 0;WriteFile(tempfile, &numBytes, 4, &bw, 0);// size of chunk (4 bytes) + + CloseHandle(tempfile); + } +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/WAVEncoder.h b/Src/Plugins/Encoder/enc_wav/WAVEncoder.h new file mode 100644 index 00000000..a9867d55 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/WAVEncoder.h @@ -0,0 +1,25 @@ +#ifndef NULLSOFT_ENC_WAV_WAVENCODER_H +#define NULLSOFT_ENC_WAV_WAVENCODER_H + + +#include <windows.h> +#include <mmreg.h> +#include <msacm.h> +#include "../nsv/enc_if.h" +#include "Config.h" +#include "Finisher.h" +class WAVEncoder : public AudioCommon +{ +public: + WAVEncoder(int nch, int srate, int bps, ACMConfig *config); + int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); //returns bytes in out + void FinishAudio(const wchar_t *filename); + void PrepareToFinish(); + + WAVEFORMATEX inputFormat; + size_t numBytes; + int first; + bool do_header; +}; + +#endif
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/enc_wav.rc b/Src/Plugins/Encoder/enc_wav/enc_wav.rc new file mode 100644 index 00000000..794a0598 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/enc_wav.rc @@ -0,0 +1,111 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONFIG DIALOGEX 0, 0, 256, 105 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "Write RIFF Header (otherwise write RAW data)",IDC_HEADER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,13,248,10 + CONTROL "Convert to format:",IDC_DO_CONVERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,26,77,10 + PUSHBUTTON "Choose Format",IDC_CHOOSE_FORMAT,7,40,63,14 + EDITTEXT IDC_FORMAT_DESCRIPTION,7,59,240,22,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Extension:",IDC_STATIC,8,86,35,13,SS_CENTERIMAGE + EDITTEXT IDC_EXTENSION,48,86,40,13,ES_AUTOHSCROLL + GROUPBOX "Wav Encoder Options",IDC_STATIC,0,0,256,105 +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + 65535 "{34DF1A2D-7EAD-41ab-B1A7-9AFA6DE2AFF1}" +END + +STRINGTABLE +BEGIN + IDS_ENC_WAV_DESC "WAV Encoder %s" +END + +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_wav/enc_wav.sln b/Src/Plugins/Encoder/enc_wav/enc_wav.sln new file mode 100644 index 00000000..4c9b46ba --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/enc_wav.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29519.181 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_wav", "enc_wav.vcxproj", "{7B43D768-8CD3-4929-B91E-DEB97F121656}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Debug|Win32.Build.0 = Debug|Win32 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Debug|x64.ActiveCfg = Debug|x64 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Debug|x64.Build.0 = Debug|x64 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Release|Win32.ActiveCfg = Release|Win32 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Release|Win32.Build.0 = Release|Win32 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Release|x64.ActiveCfg = Release|x64 + {7B43D768-8CD3-4929-B91E-DEB97F121656}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ECC95181-336A-4B52-8743-F687749093EA} + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj b/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj new file mode 100644 index 00000000..195c8a57 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj @@ -0,0 +1,252 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{7B43D768-8CD3-4929-B91E-DEB97F121656}</ProjectGuid> + <RootNamespace>enc_wav</RootNamespace> + <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Label="Vcpkg"> + <VcpkgEnabled>false</VcpkgEnabled> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + <VcpkgTriplet> + </VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <VcpkgTriplet> + </VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ENC_WAV_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>msacm32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;ENC_WAV_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>msacm32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ENC_WAV_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>msacm32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;ENC_WAV_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <Link> + <AdditionalDependencies>msacm32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="ACMEncoder.cpp" /> + <ClCompile Include="Config.cpp" /> + <ClCompile Include="main.cpp" /> + <ClCompile Include="WAVEncoder.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="ACMEncoder.h" /> + <ClInclude Include="Config.h" /> + <ClInclude Include="Finisher.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="WAVEncoder.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_wav.rc" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj"> + <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj.filters b/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj.filters new file mode 100644 index 00000000..39f5d704 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj.filters @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="ACMEncoder.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="Config.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="main.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="WAVEncoder.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="ACMEncoder.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="Config.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="Finisher.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="WAVEncoder.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{ee875982-d629-49cc-a8ae-2ba63dc64a78}</UniqueIdentifier> + </Filter> + <Filter Include="Ressource Files"> + <UniqueIdentifier>{2e191036-3949-43a0-9fce-044245ce82aa}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{df114c96-e301-4277-8849-778ec6cf693a}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_wav.rc"> + <Filter>Ressource Files</Filter> + </ResourceCompile> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/main.cpp b/Src/Plugins/Encoder/enc_wav/main.cpp new file mode 100644 index 00000000..6a0cd5d5 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/main.cpp @@ -0,0 +1,176 @@ +#define ENC_VERSION "v1.02a" + +#include "Config.h" +#include "resource.h" +#include "../nsv/enc_if.h" +#include "ACMEncoder.h" +#include "WAVEncoder.h" +#include "../nu/AutoWideFn.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + return TRUE; +} + +// wasabi based services for localisation support +#include <api/service/waServiceFactory.h> +#include "../Agave/Language/api_language.h" +#include "../winamp/wa_ipc.h" + +#include <strsafe.h> +HWND winampwnd = 0; +api_service *WASABI_API_SVC = 0; +api_language *WASABI_API_LNG = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; + +static const WAVEFORMATEX wfx_default = +{ + WAVE_FORMAT_PCM, + 2, + 44100, + 44100 * 4, + 4, + 16, + 0 +}; + +static void ReadConfig(ACMConfig *config, char *INI_FILE) +{ + int l = GetPrivateProfileIntA("enc_wav", "fmtsize", 0, INI_FILE); + + EXT_WFX convert_wfx_temp; + if (GetPrivateProfileStructA("enc_wav", "fmt", &convert_wfx_temp, sizeof(WAVEFORMATEX) + l, INI_FILE)) + memcpy(&config->convert_wfx, &convert_wfx_temp, sizeof(config->convert_wfx)); + else + config->convert_wfx.wfx = wfx_default; + + GetPrivateProfileStringA("enc_wav", "ext", "WAV", config->wav_ext, sizeof(config->wav_ext), INI_FILE); + config->header = !!GetPrivateProfileIntA("enc_wav", "header", 1, INI_FILE); + config->convert = !!GetPrivateProfileIntA("enc_wav", "convert", 0, INI_FILE); +} + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if(!WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf; + sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncWavLangGUID); + } +} + +extern "C" +{ + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (srct == mmioFOURCC('P','C','M',' ')) + { + if (*outt == mmioFOURCC('A','C','M',' ')) + { + ACMConfig config; + ReadConfig(&config, configfile); + if (config.convert) + { + ACMEncoder *encoder = new ACMEncoder(srate, nch, bps, &config); + if (encoder->GetLastError()) + { + delete encoder; + encoder=0; + } + return encoder; + } + else + { + return new WAVEncoder(nch, srate, bps, &config); + } + } + else if (*outt == mmioFOURCC('W','A','V',' ')) + { + ACMConfig config; + ReadConfig(&config, configfile); + return new WAVEncoder(nch, srate, bps, &config); + } + } + return 0; + } + + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + switch(idx) + { + case 0: + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDS_ENC_WAV_DESC), ENC_VERSION); + return mmioFOURCC('A','C','M',' '); + } + return 0; + } + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, char *configfile) + { + if (outt == mmioFOURCC('A', 'C','M',' ')) + { + ConfigWnd configwnd; + ReadConfig(&configwnd.cfg, configfile); + configwnd.configfile = configfile; + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_CONFIG, hwndParent, DlgProc, (LPARAM)&configwnd); + } + return 0; + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + ((AudioCommon*)coder)->FinishAudio(AutoWideFn(filename)); + } + + void __declspec(dllexport) FinishAudio3W(const wchar_t *filename, AudioCoder *coder) + { + ((AudioCommon*)coder)->FinishAudio(filename); + } + + int __declspec(dllexport) GetConfigItem(unsigned int outt, char *item, char *data, int len, char *configfile) + { + if (outt==mmioFOURCC('A','C','M',' ')) + { + ACMConfig config; + ReadConfig(&config, configfile); + if (!_stricmp(item, "extension")) + { + lstrcpynA(data, config.wav_ext, len); + return 1; + } + } + return 0; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + } +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/preferences.cpp b/Src/Plugins/Encoder/enc_wav/preferences.cpp new file mode 100644 index 00000000..2e71d25d --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/preferences.cpp @@ -0,0 +1 @@ +// TODO: acmFormatChoose
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wav/resource.h b/Src/Plugins/Encoder/enc_wav/resource.h new file mode 100644 index 00000000..47345ea7 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/resource.h @@ -0,0 +1,23 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by enc_acm.rc +// +#define IDD_CONFIG 101 +#define IDS_ENC_WAV_DESC 104 +#define IDC_FORMAT_DESCRIPTION 1001 +#define IDC_CHOOSE_FORMAT 1002 +#define IDC_EXTENSION 1003 +#define IDC_HEADER 1004 +#define IDC_CHECK1 1005 +#define IDC_DO_CONVERT 1005 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1006 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_wav/version.rc2 b/Src/Plugins/Encoder/enc_wav/version.rc2 new file mode 100644 index 00000000..efdcb944 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wav/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,2,1 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "1,0,2,1" + VALUE "InternalName", "Nullsoft WAV Encoder" + VALUE "LegalCopyright", "Copyright © 2006-2023 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_wav.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_wma/ASFErr.h b/Src/Plugins/Encoder/enc_wma/ASFErr.h new file mode 100644 index 00000000..66bb165e --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/ASFErr.h @@ -0,0 +1,256 @@ +//========================================================================= +// +// THIS SOFTWARE HAS BEEN LICENSED FROM MICROSOFT CORPORATION PURSUANT +// TO THE TERMS OF AN END USER LICENSE AGREEMENT ("EULA"). +// PLEASE REFER TO THE TEXT OF THE EULA TO DETERMINE THE RIGHTS TO USE THE SOFTWARE. +// +// Copyright (C) Microsoft Corporation, 1996 - 1998 All Rights Reserved. +// +//========================================================================= +/////////////////////////////////////////////////////////////////////////// +// +// ASFErr.h - definition of ASF HRESULT codes +// +// Copyright (C) Microsoft Corporation, 1997 - 1998 +// +// This file is generated by the MC tool from ASFErr.mc +// + +#ifndef _ASFERR_H +#define _ASFERR_H + + +#define STATUS_SEVERITY(hr) (((hr) >> 30) & 0x3) + + +/////////////////////////////////////////////////////////////////////////// +// +// Advanced Streaming Format (ASF) Errors (2000 - 2999) +// +// +// Values are 32 bit values layed out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-+-+-----------------------+-------------------------------+ +// |Sev|C|R| Facility | Code | +// +---+-+-+-----------------------+-------------------------------+ +// +// where +// +// Sev - is the severity code +// +// 00 - Success +// 01 - Informational +// 10 - Warning +// 11 - Error +// +// C - is the Customer code flag +// +// R - is a reserved bit +// +// Facility - is the facility code +// +// Code - is the facility's status code +// +// +// Define the facility codes +// +#define FACILITY_NS 0xD + + +// +// Define the severity codes +// +#define STATUS_SEVERITY_WARNING 0x2 +#define STATUS_SEVERITY_SUCCESS 0x0 +#define STATUS_SEVERITY_INFORMATIONAL 0x1 +#define STATUS_SEVERITY_ERROR 0x3 + + +// +// MessageId: ASF_E_BUFFEROVERRUN +// +// MessageText: +// +// An attempt was made to seek or position past the end of a buffer.%0 +// +#define ASF_E_BUFFEROVERRUN 0xC00D07D0L + +// +// MessageId: ASF_E_BUFFERTOOSMALL +// +// MessageText: +// +// The supplied input or output buffer was too small.%0 +// +#define ASF_E_BUFFERTOOSMALL 0xC00D07D1L + +// +// MessageId: ASF_E_BADLANGUAGEID +// +// MessageText: +// +// The language ID was not found.%0 +// +#define ASF_E_BADLANGUAGEID 0xC00D07D2L + +// +// MessageId: ASF_E_NOPAYLOADLENGTH +// +// MessageText: +// +// The multiple payload packet is missing the payload length.%0 +// +#define ASF_E_NOPAYLOADLENGTH 0xC00D07DBL + +// +// MessageId: ASF_E_TOOMANYPAYLOADS +// +// MessageText: +// +// The packet contains too many payloads.%0 +// +#define ASF_E_TOOMANYPAYLOADS 0xC00D07DCL + +// +// MessageId: ASF_E_PACKETCONTENTTOOLARGE +// +// MessageText: +// +// ASF_E_PACKETCONTENTTOOLARGE +// +#define ASF_E_PACKETCONTENTTOOLARGE 0xC00D07DEL + +// +// MessageId: ASF_E_UNKNOWNPACKETSIZE +// +// MessageText: +// +// Expecting a fixed packet size but min. and max. are not equal.%0 +// +#define ASF_E_UNKNOWNPACKETSIZE 0xC00D07E0L + +// +// MessageId: ASF_E_INVALIDHEADER +// +// MessageText: +// +// ASF_E_INVALIDHEADER +// +#define ASF_E_INVALIDHEADER 0xC00D07E2L + +// +// MessageId: ASF_E_NOCLOCKOBJECT +// +// MessageText: +// +// The object does not have a valid clock object.%0 +// +#define ASF_E_NOCLOCKOBJECT 0xC00D07E6L + +// +// MessageId: ASF_E_UNKNOWNCLOCKTYPE +// +// MessageText: +// +// ASF_E_UNKNOWNCLOCKTYPE +// +#define ASF_E_UNKNOWNCLOCKTYPE 0xC00D07EBL + +// +// MessageId: ASF_E_OPAQUEPACKET +// +// MessageText: +// +// An attempt was made to restore or access an opaque packet.%0 +// +#define ASF_E_OPAQUEPACKET 0xC00D07EDL + +// +// MessageId: ASF_E_WRONGVERSION +// +// MessageText: +// +// ASF_E_WRONGVERSION +// +#define ASF_E_WRONGVERSION 0xC00D07EEL + +// +// MessageId: ASF_E_OVERFLOW +// +// MessageText: +// +// An attempt was made to store a value which was larger than then destination's maximum value.%0 +// +#define ASF_E_OVERFLOW 0xC00D07EFL + +// +// MessageId: ASF_E_NOTFOUND +// +// MessageText: +// +// The object was not found.%0 +// +#define ASF_E_NOTFOUND 0xC00D07F0L + +// +// MessageId: ASF_E_OBJECTTOOBIG +// +// MessageText: +// +// The object is too large to be processed in the requested manner.%0 +// +#define ASF_E_OBJECTTOOBIG 0xC00D07F1L + +// +// MessageId: ASF_E_UNEXPECTEDVALUE +// +// MessageText: +// +// A value was not set as expected.%0 +// +#define ASF_E_UNEXPECTEDVALUE 0xC00D07F2L + +// +// MessageId: ASF_E_INVALIDSTATE +// +// MessageText: +// +// The request is not valid in the object's current state.%0 +// +#define ASF_E_INVALIDSTATE 0xC00D07F3L + +// +// MessageId: ASF_E_NOLIBRARY +// +// MessageText: +// +// This object does not have a valid library pointer; it has not been Init()'ed or it has been Shutdown().%0 +// +#define ASF_E_NOLIBRARY 0xC00D07F4L + + +/////////////////////////////////////////////////////////////////////////// +// +// Advanced Streaming Format (ASF) Success Codes (2000 - 2999) +// + +// +// MessageId: ASF_S_OPAQUEPACKET +// +// MessageText: +// +// ASF_S_OPAQUEPACKET +// +#define ASF_S_OPAQUEPACKET 0x000D07F0L + + +/////////////////////////////////////////////////////////////////////////// +// +// Advanced Streaming Format (ASF) Warnings (2000 - 2999) +// + + +#endif // _ASFERR_H + diff --git a/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.cpp b/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.cpp new file mode 100644 index 00000000..3fa7a7f0 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.cpp @@ -0,0 +1,468 @@ +#include <windows.h> +#include <mmreg.h> +#include <msacm.h> +#include "../nu/ns_wc.h" +#include "resource.h" +#include "wmsdk.h" // for IWMWriterSink + +#include "AudioCoderWMA.h" + +#include <cassert> +#include <exception> + +#include "../nu/AutoLock.h" +#include "../nu/AutoWide.h" +#include "../Winamp/strutil.h" +#include "../Agave/Language/api_language.h" + +/* TODO: implement 2-pass encoding via IWMWriterPreprocess */ + +int config_bitrate, config_samplerate, config_nch; +// New globals for encoder query + +class CustomIndexStatus : public IWMStatusCallback +{ +public: + CustomIndexStatus( HANDLE _done ) : done(_done), IWMStatusCallback(), refcount(1) + {} + + // IUnknown methods +public: + virtual ULONG STDMETHODCALLTYPE AddRef() + { + return ++refcount; + } + + + virtual ULONG STDMETHODCALLTYPE Release() + { + // If we go to zero, who cares? + return --refcount; + } + + + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) + { + HRESULT hRetval = E_NOINTERFACE; + if (IID_IWMStatusCallback == iid) + { + *ppvObject = static_cast<IWMStatusCallback *>(this); + hRetval = S_OK; + } + else + { + *ppvObject = NULL; + } + return hRetval; + } + + // IWMStatusCallback methods +public: + HRESULT STDMETHODCALLTYPE OnStatus( WMT_STATUS Status, HRESULT hr, WMT_ATTR_DATATYPE dwType, BYTE* pValue, void* pvContext ) + { + switch ( Status ) + { + case WMT_CLOSED: + // You may want to deal with the HRESULT value passed with the status. + // If you do, you should do it here. + + // Signal the event. + SetEvent(done); + break; + } + return S_OK; + } + +protected: + ULONG refcount; + HANDLE done; +}; + + +// Our custom buffer object, used by the writer sink. + +AudioCoderWMA::AudioCoderWMA(int numchannels, int samplerate, int bitspersamp, configtype *cfg, char *configfile) : AudioCoder() +{ + lastByteCount=0; + writerAdvanced=0; + begin_writing = false; + error = WMA_NO_ERROR; + sink = NULL; + + // Get globals from Winamp.ini config file + config_bitrate = cfg->config_bitrate; + config_samplerate = cfg->config_samplesSec; + config_nch = cfg->config_nch; + + timeunits_per_byte = ( ( (10000000.0) / (double)samplerate ) / (double)numchannels ) / ( (double)bitspersamp / 8.0 ); + //char t[100] = {0}; + //wsprintf(t,"%d", timeunits_per_byte); + //::MessageBox(NULL, t, t, MB_OK); + input_bytecount = 0; + + HRESULT hr = CreateAndConfigureWriter(numchannels, samplerate, bitspersamp, configfile); + + if ( FAILED(hr) ) + { + error = WMA_CANT_CREATE_WRITER; + } +} + +AudioCoderWMA::~AudioCoderWMA() +{ + if (writer) + { + if ( begin_writing ) + { + begin_writing = false; + writer->EndWriting(); + } + writer->Release(); + writer = NULL; + } + if (writerAdvanced) + { + writerAdvanced->Release(); + writerAdvanced=0; + } + if (sink) + { + sink->Release(); + sink=0; + } +} + +int AudioCoderWMA::GetLastError() +{ + return error; +} + +void AudioCoderWMA::PrepareToFinish() +{ + // We don't want to kill the objects here, because there might still be data in the pipeline. + if (writer && begin_writing) + { + begin_writing = false; + // Tell WM that we're done giving it input data. + + writer->EndWriting(); + // TODO: do we have to wait for this to finish? + } +} + +void AudioCoderWMA::OnFinished(const wchar_t *wfname) +{ + // + // Okay, here we need to go back and index the file we just wrote so it's seekable. + // + + // From: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform/htm/toconfiguretheindexer.asp + // And: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform/htm/toindexanasffile.asp + IWMIndexer* pBaseIndexer = NULL; + IWMIndexer2* pMyIndexer = NULL; + + // Create an indexer. + WMCreateIndexer(&pBaseIndexer); + + // Retrieve an IWMIndexer2 interface pointer for the indexer just created. + pBaseIndexer->QueryInterface(IID_IWMIndexer2, (void **) & pMyIndexer); + + // Release the base indexer. + pBaseIndexer->Release(); + pBaseIndexer = NULL; + + // Configure the indexer to create a timecode-based index. + pMyIndexer->Configure(0, // Stream Number, use all. + WMT_IT_PRESENTATION_TIME, // Indexer type. + NULL, // Index interval, use default. + NULL); // Index type, use default. + + // Create an event for asynchronous calls. + HANDLE done = CreateEvent(NULL, TRUE, FALSE, NULL); + + // Give that to the status object + CustomIndexStatus status( done ); + + // Start the indexer. + pMyIndexer->StartIndexing(tempFilename, &status, NULL); + + // Wait for the indexer to finish. + WaitForSingleObject(done, INFINITE); + + // Release the remaining interface. + pMyIndexer->Release(); + pMyIndexer = NULL; + + // Cleanup + CloseHandle( done ); + DeleteFileW(wfname); + MoveFileW(tempFilename, wfname); + +} + +int AudioCoderWMA::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail) +{ + HRESULT hr = S_OK; + int retval = 0; // number of bytes written into "out" + *in_used = 0; // number of bytes read from "in" + if ( !framepos && !in_avail ) + { + int x = 0; + x++; + } + assert(writer); + + // Hopefully, at the end of the stream, we still get called with "Encode" until we return 0? + if (in_avail) + { + // Allocate an INSSBuffer of the proper size to hold all the data. + INSSBuffer* pSample = NULL; + if (FAILED(writer->AllocateSample(in_avail, &pSample))) return -1; + + // Get its internal memory buffer + DWORD newBufferLength; + pSample->GetLength(&newBufferLength); + assert(newBufferLength == in_avail); + + BYTE *pdwBuffer = NULL; + if (FAILED(pSample->GetBuffer(&pdwBuffer))) return -1; + + memcpy(pdwBuffer, in, in_avail); // Send all the available bytes in the input buffer into the IWMWriter, + + pSample->SetLength(in_avail); // Tell the buffer object how much we used + + QWORD timeunits = (QWORD)( (double)input_bytecount * timeunits_per_byte ); // Compute the current timecode + // And stuff it into the writer + hr = writer->WriteSample(0, timeunits, 0, pSample); + if (FAILED(hr)) + { + } + else + { + // Increment the bytecount to be able to calculate the next timecode + input_bytecount += in_avail; + // And tell the host we used up all the available input data. + *in_used = in_avail; + } + // Release immediately + pSample->Release(); + } + + WM_WRITER_STATISTICS stats; + writerAdvanced->GetStatistics(0, &stats); + retval = (int)(stats.qwByteCount - lastByteCount); + retval = min(retval, out_avail); + lastByteCount+=retval; + memset(out, 0, retval); // so we don't write random memory to disk + + return retval; +} + +HRESULT AudioCoderWMA::SelectAndLoadResampler(int numchannels, int samplerate, int bitspersamp) +{ + DWORD inCount = 0; + BOOL success = false; + + //wsprintf(junk,"IN Chan=%d, SRate=%d, BPS=%d", numchannels, samplerate,bitspersamp); + //MessageBox(NULL, junk, "INPUT FMT", MB_OK); + // First get the number of input streams + HRESULT hr = writer->GetInputCount(&inCount); + if(!FAILED(hr)){ + //wsprintf(junk, "Input Count = %d", inCount); + //MessageBox(NULL, junk, "DEBUG", MB_OK); + // Now get the number of input formats we can resample for + DWORD fmtCount = 0; + hr = writer->GetInputFormatCount(0, &fmtCount); + if(!FAILED(hr)){ + //wsprintf(junk, "Format Count = %d", fmtCount); + //MessageBox(NULL, junk, "DEBUG", MB_OK); + // Now cycle through and find the one that matches our input fmt + for(size_t i = 0;i < fmtCount;i++){ + IWMInputMediaProps* pProps = NULL; + hr = writer->GetInputFormat(0, (DWORD)i, &pProps); + if(!FAILED(hr)){ + DWORD cbSize = 0; + // Get the size of the media type structure. + pProps->GetMediaType(NULL, &cbSize); + // Allocate memory for the media type structure. + WM_MEDIA_TYPE* pType = (WM_MEDIA_TYPE*) new BYTE[cbSize]; + if(pType != NULL){ + WAVEFORMATEX* pwave = NULL; + // Get the media type structure. + hr = pProps->GetMediaType(pType, &cbSize); + // Check that the format data is present. + if (pType->cbFormat >= sizeof(WAVEFORMATEX)){ + pwave = (WAVEFORMATEX*)pType->pbFormat; + //wsprintf(junk, "Cnannels = %d, SPerSec = %d, AvgBPS = %d, BPS = %d BALIGN = %d", + // pwave->nChannels, + // pwave->nSamplesPerSec, + // pwave->nAvgBytesPerSec, + // pwave->wBitsPerSample, + // pwave->nBlockAlign); + //MessageBox(NULL, junk, "DEBUG", MB_OK); + } + else{ + break; + } + // Try to match the channels/samplerate/and bits/samp + if((pwave->nChannels == numchannels) && (pwave->nSamplesPerSec == samplerate) && (pwave->wBitsPerSample == bitspersamp)){ + writer->SetInputProps(0, pProps); + success = true; + break; + } + } + } + } + } + } + if(success != 1){ + wchar_t junk[FILETITLE_SIZE] = {0}; + wsprintfW(junk,WASABI_API_LNGSTRINGW(IDS_CANNOT_FIND_INPUT_FORMATTER), + numchannels, samplerate,bitspersamp); + MessageBoxW(NULL, junk, WASABI_API_LNGSTRINGW(IDS_WARNING), MB_OK); + } + if (success) + return S_OK; + else if (FAILED(hr)) // if we have an error code, return it + return hr; + else + return E_FAIL; +} + + +HRESULT AudioCoderWMA::CreateAndConfigureWriter(WORD numchannels, WORD samplerate, WORD bitspersamp, char *configfile) +{ + // First, create the writer. + HRESULT hr = WMCreateWriter( NULL, &writer ); + if ( !FAILED(hr) ) + { + // Create and Configure a stream profile with the given wave limits. + WAVEFORMATEX WaveLimits = + { + WAVE_FORMAT_PCM, + numchannels, + samplerate, + samplerate * numchannels * bitspersamp / (DWORD)8, + numchannels * bitspersamp / (DWORD)8, + bitspersamp, + 0 + }; + IWMProfile* pProfile = NULL; + hr = CreateAndConfigureProfile(&WaveLimits, &pProfile, configfile); + if ( !FAILED(hr) ) + { + // Set the profile into the writer + hr = writer->SetProfile( pProfile ); + if ( !FAILED(hr) ) + { + // Go get the input resampler and load it to the profile + hr = SelectAndLoadResampler(numchannels, samplerate, bitspersamp); + if (!FAILED(hr)) + { + wchar_t tempPath[MAX_PATH] = {0}; + GetTempPathW(MAX_PATH,tempPath); + GetTempFileNameW(tempPath, L"wma", 0, tempFilename); + + // Make the custom data sink object + WMCreateWriterFileSink(&sink); + //sink = new CustomWMWriterSink; + if ( sink ) + { + sink->Open(tempFilename); + HRESULT hr; + // From MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform/htm/addingsinkstothewriter.asp + IWMWriterSink* pSinkBase = NULL; + hr = writer->QueryInterface( IID_IWMWriterAdvanced, (void **) & writerAdvanced ); + if ( !FAILED(hr) ) + { + hr = sink->QueryInterface( IID_IWMWriterSink, (void**) & pSinkBase ); + if ( !FAILED(hr) ) + { + // Stuff the custom data sink into the writer. + hr = writerAdvanced->AddSink(pSinkBase); + if ( !FAILED(hr) ) + { + // And let the writer initialize itself for output. + hr = writer->BeginWriting(); + if ( !FAILED(hr) ) + { + begin_writing = true; + } + } + else + { + error = WMA_CANT_ADD_SINK; + } + } + else + { + error = WMA_CANT_QUERY_SINK_INTERFACE; + } + } + else + { + error = WMA_CANT_QUERY_WRITER_INTERFACE; + } + } + else + { + error = WMA_CANT_MAKE_CUSTOM_SINK; + } + } + } + } + } + + return hr; +} + +HRESULT AudioCoderWMA::CreateAndConfigureProfile(WAVEFORMATEX* pWaveLimits, IWMProfile** ppProfile, char *configfile) +{ + IWMProfileManager* pProfileMgr = NULL; + + // Instantiate a profile manager object. + HRESULT hr = WMCreateProfileManager(&pProfileMgr); + if ( !FAILED(hr) ) + { + /* SAVE + // Create the empty profile. + //hr = pProfileMgr->CreateEmptyProfile(WMT_VER_9_0, ppProfile); + if ( !FAILED(hr) ){ + IWMCodecInfo3 *codecInfo = NULL; + hr = pProfileMgr->QueryInterface(&codecInfo); + if(!FAILED(hr)){ + // Find the proper IWMStreamConfig that matches the WAVEFORMATEX data. + IWMStreamConfig* pStreamConfig = NULL; + //hr = FindAudioFormat(WMMEDIASUBTYPE_WMAudioV2, pProfileMgr, pWaveLimits, config_bitrate * 1000, FALSE, &pStreamConfig); + hr = codecInfo->GetCodecFormat(WMMEDIATYPE_Audio, config_encOffset, config_formatOffset, &pStreamConfig); + if ( !FAILED(hr) ){ + // Config the stream. + // hr = pStreamConfig->SetBitrate( config_bitrate ); + hr = pStreamConfig->SetConnectionName( L"enc_wma" ); + hr = pStreamConfig->SetStreamName( L"enc_wma" ); + hr = pStreamConfig->SetStreamNumber( 1 ); + + // Stuff it into the profile + hr = (*ppProfile)->AddStream( pStreamConfig ); + } + } + } + */ + if ( !FAILED(hr) ){ + // Load the .prx file into the writer + if(configfile == NULL){ + hr = E_FAIL; + } + else{ + wchar_t cstring[4000] = {0}; + GetPrivateProfileStructW(L"audio_wma", L"profile", cstring, sizeof(cstring)/sizeof(*cstring), AutoWide(configfile)); + hr = pProfileMgr->LoadProfileByData(cstring, ppProfile); + if(hr != S_OK){ + hr = E_FAIL; + } + } + } + pProfileMgr->Release(); + } + return hr; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.h b/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.h new file mode 100644 index 00000000..0e877a97 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/AudioCoderWMA.h @@ -0,0 +1,50 @@ +#ifndef AUDIOCODERWMA_H +#define AUDIOCODERWMA_H + +#include "../nsv/enc_if.h" +#include "main.h" + +class CustomWMWriterSink; + +class AudioCoderWMA : public AudioCoder +{ +public: + AudioCoderWMA(int nch, int srate, int bps, configtype *cfg, char *configfile); + virtual int Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail); //returns bytes in out + virtual ~AudioCoderWMA(); + int GetLastError(); + void PrepareToFinish(); + void OnFinished(const wchar_t *filename); + HRESULT SelectAndLoadResampler(int numchannels, int samplerate, int bitpersamp); + + HRESULT CreateAndConfigureWriter(WORD nch, WORD srate, WORD bps, char *configfile); + HRESULT CreateAndConfigureProfile(WAVEFORMATEX* pWaveLimits, IWMProfile** ppProfile, char *configfile); + +private: + bool begin_writing; + int error; + IWMWriterFileSink *sink; + IWMWriter *writer; + IWMWriterAdvanced *writerAdvanced; + double timeunits_per_byte; // "100 nanosecond units" -- ie: ( ( (10000000.0) / (double)samplerate ) / (double)numchannels ) / ( (double)bitspersamp/ 8.0 ) + int input_bytecount; + QWORD lastByteCount; + wchar_t tempFilename[MAX_PATH]; + +}; + +enum AudioCoderWMAErrors +{ + WMA_NO_ERROR = 0, + WMA_CANT_FIND_WMSDK = -1, + WMA_CANT_LOAD_CREATOR = -2, + WMA_CANT_CREATE_WRITER = -3, + WMA_CANT_SET_INPUT_FORMAT = -4, + WMA_CANT_SET_OUTPUT_FORMAT = -5, + WMA_CANT_MAKE_CUSTOM_SINK = -6, + WMA_CANT_QUERY_WRITER_INTERFACE = -7, + WMA_CANT_QUERY_SINK_INTERFACE = -8, + WMA_CANT_ADD_SINK = -9, +}; + +#endif//AUDIOCODERWMA_H diff --git a/Src/Plugins/Encoder/enc_wma/config.cpp b/Src/Plugins/Encoder/enc_wma/config.cpp new file mode 100644 index 00000000..a1114f17 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/config.cpp @@ -0,0 +1,648 @@ +#include <windows.h> + +// LGIVEN Mods 4-10-05 +#include "main.h" +#include <wmsdk.h> +#include "../nu/AutoWide.h" +#include "../nu/ns_wc.h" +#include "../Agave/Language/api_language.h" +#include <MMSystem.h> +#include <assert.h> + +#define MAX_PASSES 1 // limited to 1pass encoding until we work out some code for 2pass encoding + +// LGIVEN Mods 4-10-05 +void readconfig(char *configfile, configtype *cfg) +{ + cfg->config_bitrate = 0; + cfg->config_bitsSample = 0; + cfg->config_nch = 0; + cfg->config_samplesSec = 0; + cfg->config_encoder = 0; + cfg->config_vbr = 0; + cfg->config_passes = 1; + if (configfile) + { + GetPrivateProfileStructA("audio_wma", "conf", cfg, sizeof(configtype), configfile); + } +} + +void writeconfig(char *configfile, configtype *cfg) +{ + if (configfile) + { + WritePrivateProfileStructA("audio_wma", "conf", cfg, sizeof(configtype), configfile); + } +} + +// New global table for channels,samplerates and bitrates +static EncoderType* encs = NULL; // Pointer to the TABLE with all config data +// Globals store current selections from Config Dialog +// Number of encoders +static int encNumbs = 0; // Total number of encoders installed WMA + +// New routine to read all config info from WMA encoder and load tables + +static BOOL loadWMATables() +{ + IWMProfileManager *profileManager; + IWMProfileManager2 *profileManager2; + IWMCodecInfo3 *codecInfo; + WAVEFORMATEX *pwave; + HRESULT hr; + int legalFormats = 0; + + WMCreateProfileManager(&profileManager); + profileManager->QueryInterface(&profileManager2); + profileManager2->SetSystemProfileVersion(WMT_VER_9_0); + + profileManager->QueryInterface(&codecInfo); + // Get the number of AUDIO Codecs + DWORD numCodecs = 0; + codecInfo->GetCodecInfoCount(WMMEDIATYPE_Audio, &numCodecs); + // If there are no encoders, just return + if (numCodecs == 0) + { + return false; + } + // Allocate structs for codecs and zero them all + encs = (EncoderType *) calloc(numCodecs * 4, sizeof(struct EncoderType)); + if (encs != NULL) + { + encNumbs = numCodecs * 4; + } + else + { + wchar_t titleStr[32] = {0}; + MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_ALLOCATE_MEM), + WASABI_API_LNGSTRINGW_BUF(IDS_WMA_ENCODER_ERROR,titleStr,32), MB_OK); + return false; + } + // Now cycle through the codecs + EncoderType* encp = encs; + for (BOOL isVBR = 0;isVBR != 2;isVBR++) + for (DWORD numPasses = 1;numPasses <= MAX_PASSES;numPasses++) + for (DWORD i = 0;i != numCodecs;i++) + { + wchar_t codecName[5000] = {0}; + DWORD codecNameSize = 5000; + + codecInfo->SetCodecEnumerationSetting(WMMEDIATYPE_Audio, i, g_wszVBREnabled, WMT_TYPE_BOOL, (BYTE *)&isVBR, sizeof(BOOL)); + codecInfo->SetCodecEnumerationSetting(WMMEDIATYPE_Audio, i, g_wszNumPasses, WMT_TYPE_DWORD, (BYTE *)&numPasses, sizeof(DWORD)); + codecInfo->GetCodecName(WMMEDIATYPE_Audio, i, codecName, &codecNameSize); + // Get the number of formats for this codec + DWORD formatCount = 0; + hr = codecInfo->GetCodecFormatCount( WMMEDIATYPE_Audio, i, &formatCount ); + if (FAILED(hr)) + { + continue; + } + else if (formatCount == 0) + { + continue; + } + else + { + // Fill the EncoderType struct and allocate structs for format info + // First allocate the space for all the formatType structs + encp->formats = (formatType *) malloc(formatCount * sizeof(struct formatType)); + if (encp->formats == NULL) + { + wchar_t titleStr[32] = {0}; + MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_ALLOCATE_MEM), + WASABI_API_LNGSTRINGW_BUF(IDS_WMA_ENCODER_ERROR,titleStr,32), MB_OK); + return false; + } + // Now fill the EncoderType struct with name and info + encp->encoderName = _wcsdup(codecName); + encp->numFormats = formatCount; + encp->offset = i; + encp->vbr = isVBR; + encp->numPasses = numPasses; + } + // Now cycle through the formats for this codec + legalFormats = 0; + formatType *fmts = encp->formats; + for (DWORD f = 0;f != formatCount;f++) + { + wchar_t fDesc[5000] = {0}; + DWORD size = 5000; + // Get the config info for this encoding format in string format + IWMStreamConfig *streamConfig; + codecInfo->GetCodecFormatDesc(WMMEDIATYPE_Audio, i, f, &streamConfig, fDesc, &size); + // Now get the config info + IWMMediaProps *props; + streamConfig->QueryInterface(&props); + // Get the bitrate + //DWORD bitRate; + //streamConfig->GetBitrate(&bitRate); + // Get the Media Encoder type + DWORD mediaTypeSize; + props->GetMediaType(0, &mediaTypeSize); + WM_MEDIA_TYPE *mediaType = (WM_MEDIA_TYPE *)new char[mediaTypeSize]; + props->GetMediaType(mediaType, &mediaTypeSize); + // Go get the WAVEFORMATEX Struct from the + if (mediaType->cbFormat >= sizeof(WAVEFORMATEX)) + { + pwave = (WAVEFORMATEX*)mediaType->pbFormat; + if (pwave != NULL) + { + // Check to see if this is an A/V codec format + // If so, do not save it + + /* + if ((pwave->nAvgBytesPerSec / pwave->nBlockAlign) == + ((pwave->nAvgBytesPerSec >= 3995) ? 5 : 3)) + { + delete(mediaType); + props->Release(); + streamConfig->Release(); + continue; + }*/ + + // old way of checking + if ((wcsstr(fDesc, L"A/V")) != NULL) + { + delete[] (mediaType); + props->Release(); + streamConfig->Release(); + continue; + } + // Load the format name + fmts->formatName = _wcsdup(fDesc); + // Load all the format values and the offset + if ((pwave->nAvgBytesPerSec & 0x7FFFFF00) == 0x7FFFFF00) + { + fmts->bitrate = (pwave->nAvgBytesPerSec & 0x000000FF); + fmts->vbr = 1; + } + else + { + fmts->bitrate = (pwave->nAvgBytesPerSec * 8); + fmts->vbr = 0; + } + fmts->bitsSample = pwave->wBitsPerSample; + fmts->nChannels = pwave->nChannels; + fmts->samplesSec = pwave->nSamplesPerSec; + fmts->offset = f; + } + else + { + wchar_t titleStr[32] = {0}; + MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_GET_STRUCTURE), + WASABI_API_LNGSTRINGW_BUF(IDS_WMA_ENCODER_ERROR,titleStr,32), MB_OK); + return false; + } + } + else + { + wchar_t titleStr[32] = {0}; + MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_GET_ENCODER4_INFO), + WASABI_API_LNGSTRINGW_BUF(IDS_WMA_ENCODER_ERROR,titleStr,32), MB_OK); + return false; + } + // Set the media type value in the EncoderType struct on first legal format + if (f == 0) + { + encp->mediaType = mediaType->subtype; + } + // Now point to the next table block and inc the legal formats count + fmts++; + legalFormats++; + // And release the props and streams structs + delete[] (mediaType); + props->Release(); + streamConfig->Release(); + + } + // If there are no legal formats for this codec then skip it + if (legalFormats == 0) + { + delete[] encp->encoderName; + encp->encoderName = NULL; + encp->numFormats = legalFormats; + encp->offset = 0; + } + // Else load number of legal formats and save it + else + { + encp->numFormats = legalFormats; + encp++; + } + } + return true; +} + +static int FindFormatNumber(formatType *formats, int numFormats, configtype *cfg) +{ + for (int i = 0;i < numFormats;i++, formats++) + { + if (formats->bitrate == cfg->config_bitrate + && formats->bitsSample == cfg->config_bitsSample + && formats->nChannels == cfg->config_nch + && formats->samplesSec == cfg->config_samplesSec) + return formats->offset; + } + + return 0; +} + +static VOID dumpProfile(char *configfile, BOOL isVBR, DWORD numPasses, int encNumb, int fmtNumb) +{ + // Create a Profile and dump it + IWMProfileManager *pmgr = NULL; + IWMProfile *prof = NULL; + IWMStreamConfig *sconf = NULL; + IWMCodecInfo3 *cinfo = NULL; + DWORD ssize; + wchar_t errorTitle[128] = {0}; + WASABI_API_LNGSTRINGW_BUF(IDS_WMA_CONFIG_FILE_ERROR,errorTitle,128); + + HRESULT hr = WMCreateProfileManager(&pmgr); + if (!FAILED(hr)) + { + hr = pmgr->CreateEmptyProfile(WMT_VER_9_0, &prof); + if (!FAILED(hr)) + { + hr = pmgr->QueryInterface(&cinfo); + if (!FAILED(hr)) + { + cinfo->SetCodecEnumerationSetting(WMMEDIATYPE_Audio, encNumb, g_wszVBREnabled, WMT_TYPE_BOOL, (BYTE *)&isVBR, sizeof(BOOL)); + cinfo->SetCodecEnumerationSetting(WMMEDIATYPE_Audio, encNumb, g_wszNumPasses, WMT_TYPE_DWORD, (BYTE *)&numPasses, sizeof(DWORD)); + cinfo->GetCodecFormat(WMMEDIATYPE_Audio, encNumb, fmtNumb, &sconf); + sconf->SetConnectionName(L"enc_wma"); + sconf->SetStreamName(L"enc_wma"); + sconf->SetStreamNumber(1); + hr = prof->AddStream(sconf); + if (!FAILED(hr)) + { + hr = pmgr->SaveProfile(prof, NULL, &ssize); + if (!FAILED(hr)) + { + WCHAR* pstring = new WCHAR[ssize]; + if (pstring != NULL) + { + hr = pmgr->SaveProfile(prof, pstring, &ssize); + if (!FAILED(hr)) + { + wchar_t cstring[4000] = {0}; + wcsncpy(cstring, pstring, 4000 - 1); + WritePrivateProfileStructW(L"audio_wma", L"profile", cstring, sizeof(cstring) / sizeof(*cstring), AutoWide(configfile)); + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_SAVE_PROFILE_READ_ERROR), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_MEM_ALLOCATION_ERROR), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_PROFILE_SAVE_SIZE_ERROR), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_READ_AUDIO_STREAM), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_GET_CODEC_INFO), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_CREATE_A_PROFILE), errorTitle, MB_OK); } + } + else{ MessageBoxW(NULL, WASABI_API_LNGSTRINGW(IDS_CANNOT_CREATE_PROFILE_MANAGER), errorTitle, MB_OK); } + pmgr->Release(); + prof->Release(); + sconf->Release(); + cinfo->Release(); +} + +static bool Has(HWND hwndDlg, int item, int data) +{ + int numChoices = SendDlgItemMessage(hwndDlg, item, CB_GETCOUNT, 0, 0); + for (int i = 0;i < numChoices;i++) + { + if (SendDlgItemMessage(hwndDlg, item, CB_GETITEMDATA, i, 0) == data) + return true; + } + return false; +} + +static int EncodeSampleFormat(int bps, int numChannels, int sampleRate) +{ + // 20 bits sampleRate + assert((sampleRate & 0xFFFFF) == sampleRate); + // 6 bits numChannels + assert((numChannels & 0x3F) == numChannels); + // 6 bits bps + assert((bps & 0x3F) == bps); + + return (sampleRate << 12) | (numChannels << 6) | (bps); +} + +static void DecodeSampleFormat(int data, int &bps, int &numChannels, int &sampleRate) +{ + bps = data & 0x3F; + data >>= 6; + numChannels = data & 0x3F; + data >>= 6; + sampleRate = data; +} + +static int EncodeVBR(BOOL isVBR, DWORD numPasses) +{ + // 1 bits VBR + assert((isVBR & 0x1) == isVBR); + // 15 bits numPasses + assert((numPasses & 0x7FFF) == numPasses); + + return (isVBR << 15) | (numPasses); +} + +static void DecodeVBR(int data, BOOL &isVBR, DWORD &numPasses) +{ + numPasses = data & 0x7FFF; + data >>= 15; + isVBR = data & 0x1; +} + +static void AutoSelect(HWND hwndDlg, int dlgItem) +{ + if (SendDlgItemMessage(hwndDlg, dlgItem, CB_GETCURSEL, 0, 0) == CB_ERR) + SendDlgItemMessage(hwndDlg, dlgItem, CB_SETCURSEL, 0, 0); +} + +static EncoderType *FindEncoder(int encoderNumber, BOOL isVBR, DWORD numPasses) +{ + EncoderType* enc = encs; + for (int i = 0;i < encNumbs;i++, enc++) + { + if (enc->encoderName == NULL) + return 0; //WTF? + if (enc->offset == encoderNumber && enc->vbr == isVBR && enc->numPasses == numPasses) + return enc; + } + return 0; //WTF? +} + +#define MASK_ENCODER 0x1 +#define MASK_VBR 0x2 +#define MASK_SAMPLE_FORMAT 0x4 +#define MASK_BITRATE 0x8 +#define MASK_ALL 0xF + +static void ResetConfig(HWND hwndDlg, EncoderType *encs, configtype *cfg, int mask) +{ + wchar_t buf1[100] = {0}; + EncoderType* enc = encs; + + if (mask & MASK_ENCODER) SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_RESETCONTENT, 0, 0); + if (mask & MASK_SAMPLE_FORMAT) SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_RESETCONTENT, 0, 0); + if (mask & MASK_BITRATE) SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_RESETCONTENT, 0, 0); + if (mask & MASK_VBR) SendDlgItemMessage(hwndDlg, IDC_VBR, CB_RESETCONTENT, 0, 0); + + // reset encoders + int thisVBR = EncodeVBR(cfg->config_vbr, cfg->config_passes); + for (int i = 0;i < encNumbs;i++, enc++) + { + if (enc->encoderName == NULL) + break; + else if ((mask & MASK_ENCODER) && !Has(hwndDlg, IDC_ENCODER, enc->offset)) + { + int newpos = SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_ADDSTRING, 0, (LPARAM)enc->encoderName); + SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_SETITEMDATA, newpos, enc->offset); + + if (cfg->config_encoder == enc->offset) + { + SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_SETCURSEL, newpos, 0); + } + } + int data = EncodeVBR(enc->vbr, enc->numPasses); + if ((mask & MASK_VBR) && cfg->config_encoder == enc->offset && !Has(hwndDlg, IDC_VBR, data)) + { + int newpos = CB_ERR; + if (enc->vbr == FALSE && enc->numPasses == 1) + newpos = SendDlgItemMessageW(hwndDlg, IDC_VBR, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_CBR)); + else if (enc->vbr == FALSE && enc->numPasses == 2) + newpos = SendDlgItemMessageW(hwndDlg, IDC_VBR, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_2_PASS_CBR)); + else if (enc->vbr == TRUE && enc->numPasses == 1) + newpos = SendDlgItemMessageW(hwndDlg, IDC_VBR, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_VBR)); + else if (enc->vbr == TRUE && enc->numPasses == 2) + newpos = SendDlgItemMessageW(hwndDlg, IDC_VBR, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(IDS_ABR)); + + SendDlgItemMessage(hwndDlg, IDC_VBR, CB_SETITEMDATA, newpos, data); + + if (thisVBR == data) + SendDlgItemMessage(hwndDlg, IDC_VBR, CB_SETCURSEL, newpos, 0); + } + } + + AutoSelect(hwndDlg, IDC_ENCODER); + AutoSelect(hwndDlg, IDC_VBR); + int pos = SendDlgItemMessage(hwndDlg, IDC_VBR, CB_GETCURSEL, 0, 0); + int data = SendDlgItemMessage(hwndDlg, IDC_VBR, CB_GETITEMDATA, pos, 0); + DecodeVBR(data, cfg->config_vbr, cfg->config_passes); + + pos = SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_GETCURSEL, 0, 0); + data = SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_GETITEMDATA, pos, 0); + cfg->config_encoder = data; + + // Now set up for dialog fill + enc = FindEncoder(cfg->config_encoder, cfg->config_vbr, cfg->config_passes); + + // Fill the current values + formatType *fmt = enc->formats; + + int thisSampleFormat = EncodeSampleFormat(cfg->config_bitsSample, cfg->config_nch, cfg->config_samplesSec); + for (int i = 0;i < enc->numFormats;i++, fmt++) + { + int data = EncodeSampleFormat(fmt->bitsSample, fmt->nChannels, fmt->samplesSec); + // Add channels to list + if ((mask & MASK_SAMPLE_FORMAT) && !Has(hwndDlg, IDC_SAMPLE_FORMAT, data)) + { + if (fmt->nChannels == 1) + wsprintfW(buf1, WASABI_API_LNGSTRINGW(IDS_MONO_INFO), fmt->bitsSample, fmt->samplesSec); + else if (fmt->nChannels == 2) + wsprintfW(buf1, WASABI_API_LNGSTRINGW(IDS_STEREO_INFO), fmt->bitsSample, fmt->samplesSec); + else + wsprintfW(buf1, WASABI_API_LNGSTRINGW(IDS_CHANNELS_INFO), fmt->bitsSample, fmt->nChannels, fmt->samplesSec); + + int newpos; + if (fmt->bitsSample) + newpos = SendDlgItemMessageW(hwndDlg, IDC_SAMPLE_FORMAT, CB_ADDSTRING, 0, (LPARAM)buf1); + else + newpos = SendDlgItemMessageW(hwndDlg, IDC_SAMPLE_FORMAT, CB_ADDSTRING, 0, (LPARAM)buf1 + 8); // skip "0 bits, " + + SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_SETITEMDATA, newpos, data); + // Now set current select for number of channels sample + if (thisSampleFormat == data) + SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_SETCURSEL, newpos, 0); + } + } + + if (SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETCURSEL, 0, 0) == CB_ERR) + { + int num = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETCOUNT, 0, 0); + int defaultSampleFormat = EncodeSampleFormat(16, 2, 44100); + for (int i = 0;i < num;i++) + { + int data = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETITEMDATA, i, 0); + if (data == defaultSampleFormat) + SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_SETCURSEL, i, 0); + } + } + + AutoSelect(hwndDlg, IDC_SAMPLE_FORMAT); + pos = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETCURSEL, 0, 0); + data = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETITEMDATA, pos, 0); + DecodeSampleFormat(data, cfg->config_bitsSample, cfg->config_nch, cfg->config_samplesSec); + + thisSampleFormat = EncodeSampleFormat(cfg->config_bitsSample, cfg->config_nch, cfg->config_samplesSec); + + // Next Show the Bitrates + fmt = enc->formats; + for (int i = 0;i < enc->numFormats;i++, fmt++) + { + int data = EncodeSampleFormat(fmt->bitsSample, fmt->nChannels, fmt->samplesSec); + if (thisSampleFormat == data) + { + if ((mask & MASK_BITRATE) && !Has(hwndDlg, IDC_BRATE, fmt->bitrate)) + { + if (fmt->vbr) + SetDlgItemTextW(hwndDlg, IDC_STATIC_BITRATE, WASABI_API_LNGSTRINGW(IDS_QUALITY)); + else + SetDlgItemTextW(hwndDlg, IDC_STATIC_BITRATE, WASABI_API_LNGSTRINGW(IDS_BITRATE)); + + wsprintfW(buf1, L"%d", fmt->bitrate); + int newpos = SendDlgItemMessageW(hwndDlg, IDC_BRATE, CB_ADDSTRING, 0, (LPARAM)buf1); + SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_SETITEMDATA, newpos, fmt->bitrate); + // Set the current bit rate + if (cfg->config_bitrate == fmt->bitrate) + { + SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_SETCURSEL, newpos, 0); + } + } + } + } + + if (SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETCURSEL, 0, 0) == CB_ERR) + { + int num = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETCOUNT, 0, 0); + + for (int i = 0;i < num;i++) + { + int data = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETITEMDATA, i, 0); + if (data == 50 || (data / 1000 == 128)) + SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_SETCURSEL, i, 0); + } + } + + AutoSelect(hwndDlg, IDC_BRATE); + + pos = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETCURSEL, 0, 0); + data = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETITEMDATA, pos, 0); + cfg->config_bitrate = data; +} + +BOOL CALLBACK ConfigProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + configwndrec *wc = NULL; + if (uMsg == WM_INITDIALOG) + { + // LGIVEN Mod 4-10-05 +#if defined(_WIN64) + SetWindowLong(hwndDlg, GWLP_USERDATA, lParam); +#else + SetWindowLong(hwndDlg, GWL_USERDATA, lParam); +#endif + if (lParam) + { + // Get the saved params + wc = (configwndrec*)lParam; + + loadWMATables(); + ResetConfig(hwndDlg, encs , &wc->cfg, MASK_ALL); + } + return 1; + } + if (uMsg == WM_DESTROY) + { +#if defined(_WIN64) + wc = (configwndrec*)SetWindowLong(hwndDlg, GWLP_USERDATA, 0); +#else + wc = (configwndrec*)SetWindowLong(hwndDlg, GWL_USERDATA, 0); +#endif + if (wc) + { + EncoderType *encoder=FindEncoder(wc->cfg.config_encoder,wc->cfg.config_vbr, wc->cfg.config_passes); + int formatNumber = FindFormatNumber(encoder->formats, encoder->numFormats, &wc->cfg); + // Dump the profile in WMA format + dumpProfile(wc->configfile, wc->cfg.config_vbr, wc->cfg.config_passes, wc->cfg.config_encoder, formatNumber); + // Write it to config file + writeconfig(wc->configfile, &wc->cfg); + free(wc->configfile); + free(wc); + } + return 0; + } + if (uMsg == WM_COMMAND) + { + switch (LOWORD(wParam)) + { + case IDC_VBR: + if ((HIWORD(wParam) == CBN_SELCHANGE)) + { +#if defined(_WIN64) + wc = (configwndrec*)GetWindowLong(hwndDlg, GWLP_USERDATA); +#else + wc = (configwndrec*)GetWindowLong(hwndDlg, GWL_USERDATA); +#endif + int pos = SendDlgItemMessage(hwndDlg, IDC_VBR, CB_GETCURSEL, 0, 0); + int data = SendDlgItemMessage(hwndDlg, IDC_VBR, CB_GETITEMDATA, pos, 0); + DecodeVBR(data, wc->cfg.config_vbr, wc->cfg.config_passes); + ResetConfig(hwndDlg, encs, &wc->cfg, MASK_BITRATE | MASK_SAMPLE_FORMAT); + } + break; + + case IDC_SAMPLE_FORMAT: + if ((HIWORD(wParam) == CBN_SELCHANGE)) + { +#if defined(_WIN64) + wc = (configwndrec*)GetWindowLong(hwndDlg, GWLP_USERDATA); +#else + wc = (configwndrec*)GetWindowLong(hwndDlg, GWL_USERDATA); +#endif + int pos = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETCURSEL, 0, 0); + int data = SendDlgItemMessage(hwndDlg, IDC_SAMPLE_FORMAT, CB_GETITEMDATA, pos, 0); + DecodeSampleFormat(data, wc->cfg.config_bitsSample, wc->cfg.config_nch, wc->cfg.config_samplesSec); + ResetConfig(hwndDlg, encs, &wc->cfg, MASK_BITRATE); + } + break; + + case IDC_BRATE: + if ((HIWORD(wParam) == CBN_SELCHANGE)) + { +#if defined(_WIN64) + wc = (configwndrec*)GetWindowLong(hwndDlg, GWLP_USERDATA); +#else + wc = (configwndrec*)GetWindowLong(hwndDlg, GWL_USERDATA); +#endif + int pos = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETCURSEL, 0, 0); + int data = SendDlgItemMessage(hwndDlg, IDC_BRATE, CB_GETITEMDATA, pos, 0); + wc->cfg.config_bitrate = data; + } + break; + + case IDC_ENCODER: + if ((HIWORD(wParam) == CBN_SELCHANGE)) + { +#if defined(_WIN64) + wc = (configwndrec*)GetWindowLong(hwndDlg, GWLP_USERDATA); +#else + wc = (configwndrec*)GetWindowLong(hwndDlg, GWL_USERDATA); +#endif + if (wc) + { + int pos = SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_GETCURSEL, 0, 0); + int data = SendDlgItemMessage(hwndDlg, IDC_ENCODER, CB_GETITEMDATA, pos, 0); + wc->cfg.config_encoder = data; + ResetConfig(hwndDlg, encs, &wc->cfg, MASK_VBR | MASK_SAMPLE_FORMAT | MASK_BITRATE); + } + } + break; + + } + } + return 0; +}
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wma/enc_wma.rc b/Src/Plugins/Encoder/enc_wma/enc_wma.rc new file mode 100644 index 00000000..6b81c4a4 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/enc_wma.rc @@ -0,0 +1,128 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG1 DIALOGEX 0, 0, 256, 167 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Windows Media Audio",IDC_STATIC,0,0,256,167 + COMBOBOX IDC_ENCODER,18,13,145,148,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Encoder Format",IDC_STATIC,166,13,60,12,SS_CENTERIMAGE + COMBOBOX IDC_SAMPLE_FORMAT,17,30,145,133,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Sample Format",IDC_STATIC,166,30,71,12,SS_CENTERIMAGE + COMBOBOX IDC_VBR,18,48,59,67,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BRATE,86,48,77,116,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Bitrate (Bits/Sec)",IDC_STATIC_BITRATE,165,48,54,12,SS_CENTERIMAGE + CTEXT "Portions utilize Microsoft Windows Media Technologies.\nCopyright © 1992-2019 Microsoft Corporation. All Rights Reserved.",IDC_STATIC,14,144,227,18 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""version.rc2""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + 65535 "{33BC12FD-E7F7-42ec-8FE3-2D8BD3A977C2}" +END + +STRINGTABLE +BEGIN + IDS_CANNOT_FIND_INPUT_FORMATTER + "Cannot find input formatter for:\n\nChannels = %d, Sample Rate = %d, Bits/Sample = %d\n\nNo resampler available for this input format" + IDS_WARNING "WARNING" + IDS_CANNOT_ALLOCATE_MEM "Cannot allocate memory for WMA encoder format info" + IDS_WMA_ENCODER_ERROR "WMA Encoder Error" + IDS_CANNOT_GET_STRUCTURE "Cannot get structure with format details" + IDS_CANNOT_GET_ENCODER4_INFO "Cannot get detail info for Encoder4 format" + IDS_SAVE_PROFILE_READ_ERROR "Save profile read error" + IDS_MEM_ALLOCATION_ERROR "Memory allocation error" + IDS_PROFILE_SAVE_SIZE_ERROR "Profile save size get error" + IDS_CANNOT_READ_AUDIO_STREAM "Cannot create audio stream" + IDS_CANNOT_GET_CODEC_INFO "Cannot get codec interface" + IDS_CANNOT_CREATE_A_PROFILE "Cannot create a profile" + IDS_CANNOT_CREATE_PROFILE_MANAGER "Cannot create a profile manager" + IDS_WMA_CONFIG_FILE_ERROR "WMA Config File Error" +END + +STRINGTABLE +BEGIN + IDS_CBR "CBR" + IDS_2_PASS_CBR "2-pass CBR" + IDS_VBR "VBR" + IDS_ABR "ABR" + IDS_MONO_INFO "%d bits, mono, %d Hz" + IDS_STEREO_INFO "%d bits, stereo, %d Hz" + IDS_CHANNELS_INFO "%d bits, %d channels, %d Hz" + IDS_QUALITY "Quality (0-100)" + IDS_BITRATE "Bitrate (Bits/Sec)" + IDS_ENC_WMA_DESC "WMA Encoder %s" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc2" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Src/Plugins/Encoder/enc_wma/enc_wma.sln b/Src/Plugins/Encoder/enc_wma/enc_wma.sln new file mode 100644 index 00000000..6eb2c7ca --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/enc_wma.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_wma", "enc_wma.vcxproj", "{5F4B0989-B35B-40C0-BAA1-E7058377B398}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Debug|Win32.ActiveCfg = Debug|Win32 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Debug|Win32.Build.0 = Debug|Win32 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Debug|x64.ActiveCfg = Debug|x64 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Debug|x64.Build.0 = Debug|x64 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Release|Win32.ActiveCfg = Release|Win32 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Release|Win32.Build.0 = Release|Win32 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Release|x64.ActiveCfg = Release|x64 + {5F4B0989-B35B-40C0-BAA1-E7058377B398}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {424261B8-8392-4100-A876-CD8560D5D1AC} + EndGlobalSection +EndGlobal diff --git a/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj b/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj new file mode 100644 index 00000000..c0580d2c --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj @@ -0,0 +1,276 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{5F4B0989-B35B-40C0-BAA1-E7058377B398}</ProjectGuid> + <RootNamespace>enc_wma</RootNamespace> + <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <PlatformToolset>v142</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + <IncludePath>$(IncludePath)</IncludePath> + <LibraryPath>$(LibraryPath)</LibraryPath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> + <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Label="Vcpkg"> + <VcpkgEnabled>false</VcpkgEnabled> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + <VcpkgTriplet> + </VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <VcpkgTriplet> + </VcpkgTriplet> + </PropertyGroup> + <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <VcpkgConfiguration>Debug</VcpkgConfiguration> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;NSV_CODER_WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>Default</CompileAs> + <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>wmvcore.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;NSV_CODER_WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>false</MinimalRebuild> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>Default</CompileAs> + <DisableSpecificWarnings>4244;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>wmvcore.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ +xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;NSV_CODER_WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <CompileAs>Default</CompileAs> + <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4210 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>wmvcore.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MinSpace</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;NSV_CODER_WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>None</DebugInformationFormat> + <CompileAs>Default</CompileAs> + <DisableSpecificWarnings>4244;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> + <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalOptions>/ignore:4210 %(AdditionalOptions)</AdditionalOptions> + <AdditionalDependencies>wmvcore.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command> + <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="AudioCoderWMA.cpp" /> + <ClCompile Include="config.cpp" /> + <ClCompile Include="main.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="AudioCoderWMA.h" /> + <ClInclude Include="CustomWMWriterSink.h" /> + <ClInclude Include="main.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_wma.rc" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj"> + <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj.filters b/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj.filters new file mode 100644 index 00000000..6b65e74e --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/enc_wma.vcxproj.filters @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="AudioCoderWMA.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="config.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="main.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="AudioCoderWMA.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="CustomWMWriterSink.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="main.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{497dbf34-c784-481d-bc15-343f4d25c508}</UniqueIdentifier> + </Filter> + <Filter Include="Ressource Files"> + <UniqueIdentifier>{a60f8eac-325c-466b-8a17-69b1064e57fb}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{33266828-89ee-4119-b784-03c8edaad9a1}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="enc_wma.rc"> + <Filter>Ressource Files</Filter> + </ResourceCompile> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wma/main.cpp b/Src/Plugins/Encoder/enc_wma/main.cpp new file mode 100644 index 00000000..451304a1 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/main.cpp @@ -0,0 +1,212 @@ +/* +** nsv_coder_lame: main.cpp - LAME mp3 encoder plug-in +** (requires lame_enc.dll) +** +** Copyright (C) 2001-2006 Nullsoft, Inc. +** +** This software is provided 'as-is', without any express or implied warranty. +** In no event will the authors be held liable for any damages arising from the use of this software. +** +** Permission is granted to anyone to use this software for any purpose, including commercial +** applications, and to alter it and redistribute it freely, subject to the following restrictions: +** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the +** original software. If you use this software in a product, an acknowledgment in the product +** documentation would be appreciated but is not required. +** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as +** being the original software. +** 3. This notice may not be removed or altered from any source distribution. +*/ + +#define ENC_VERSION "v1.23" + +#include <windows.h> +#include <stdio.h> +#include <wmsdk.h> + +#include <mmreg.h> +#include <msacm.h> + +#include "AudioCoderWMA.h" +#include "../nu/AutoWideFn.h" + +// wasabi based services for localisation support +#include <api/service/waServiceFactory.h> +#include "../Agave/Language/api_language.h" +#include "../winamp/wa_ipc.h" + +#include <strsafe.h> + +HWND winampwnd = 0; +api_service *WASABI_API_SVC = 0; +api_language *WASABI_API_LNG = 0; +HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + return TRUE; +} + +int getwrittentime(); + +HINSTANCE g_hinst; + +int g_srate, g_numchan, g_bps; +volatile int writtentime, w_offset; + +// LGIVEN Mod 4-10-05 +void readconfig(char *configfile, configtype *cfg); +void writeconfig(char *configfile, configtype *cfg); + +static HINSTANCE GetMyInstance() +{ + MEMORY_BASIC_INFORMATION mbi = {0}; + if(VirtualQuery(GetMyInstance, &mbi, sizeof(mbi))) + return (HINSTANCE)mbi.AllocationBase; + return NULL; +} + +void GetLocalisationApiService(void) +{ + if(!WASABI_API_LNG) + { + // loader so that we can get the localisation service api for use + if(!WASABI_API_SVC) + { + WASABI_API_SVC = (api_service*)SendMessage(winampwnd, WM_WA_IPC, 0, IPC_GET_API_SERVICE); + if (WASABI_API_SVC == (api_service*)1) + { + WASABI_API_SVC = NULL; + return; + } + } + + if(!WASABI_API_LNG) + { + waServiceFactory *sf; + sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID); + if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface()); + } + + // need to have this initialised before we try to do anything with localisation features + WASABI_API_START_LANG(GetMyInstance(),EncWMALangGUID); + } +} + + +// ================================================================== +// +// Published enc_wma methods. +// +// ================================================================== +#include <cassert> + +extern "C" +{ + + unsigned int __declspec(dllexport) GetAudioTypes3(int idx, char *desc) + { + if ( idx == 0 ) + { + GetLocalisationApiService(); + StringCchPrintfA(desc, 1024, WASABI_API_LNGSTRING(IDS_ENC_WMA_DESC), ENC_VERSION); + return mmioFOURCC('W', 'M', 'A', ' '); + } + return 0; + } + + AudioCoder __declspec(dllexport) *CreateAudio3(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile) + { + if (srct == mmioFOURCC('P', 'C', 'M', ' ') && *outt == mmioFOURCC('W', 'M', 'A', ' ')) + { + GetLocalisationApiService(); + configtype cfg; + readconfig(configfile, &cfg); + + AudioCoderWMA *t = new AudioCoderWMA(nch, srate, bps, &cfg, configfile); + + if ( t && t->GetLastError()) + { + delete t; + return NULL; + } + else return t; + } + return NULL; + } + + void __declspec(dllexport) FinishAudio3(const char *filename, AudioCoder *coder) + { + ((AudioCoderWMA*)coder)->OnFinished(AutoWideFn(filename)); + } + + void __declspec(dllexport) FinishAudio3W(const wchar_t *filename, AudioCoder *coder) + { + ((AudioCoderWMA*)coder)->OnFinished(filename); + } + + void __declspec(dllexport) PrepareToFinish(const char *filename, AudioCoder *coder) + { + ((AudioCoderWMA*)coder)->PrepareToFinish(); + } + + void __declspec(dllexport) PrepareToFinishW(const wchar_t *filename, AudioCoder *coder) + { + ((AudioCoderWMA*)coder)->PrepareToFinish(); + } + + HWND __declspec(dllexport) ConfigAudio3(HWND hwndParent, HINSTANCE hinst, unsigned int outt, char *configfile) + { + if (outt == mmioFOURCC('W', 'M', 'A', ' ')) + { + configwndrec *wr = (configwndrec*)malloc(sizeof(configwndrec)); + if (configfile) + { + wr->configfile = _strdup(configfile); + } + else + { + wr->configfile = 0; + } + readconfig(configfile, &wr->cfg); + GetLocalisationApiService(); + return WASABI_API_CREATEDIALOGPARAMW(IDD_DIALOG1, hwndParent, ConfigProc, (LPARAM)wr); + } + return NULL; + } + + int __declspec(dllexport) SetConfigItem(unsigned int outt, char *item, char *data, char *configfile) + { + if (outt == mmioFOURCC('W', 'M', 'A', ' ')) + { + configtype cfg; + readconfig(configfile, &cfg); + if (!lstrcmpiA(item, "bitrate")) + { + //cfg.config_bitrate = atoi(data) * 1000; + } + writeconfig(configfile, &cfg); + return 1; + } + return 0; + } + + int __declspec(dllexport) GetConfigItem(unsigned int outt, char *item, char *data, int len, char *configfile) + { + if (outt == mmioFOURCC('W', 'M', 'A', ' ')) + { + configtype cfg; + readconfig(configfile, &cfg); + if (!lstrcmpiA(item, "bitrate")) + { + StringCchPrintfA(data, len, "%d", cfg.config_bitrate / 1000); + } + return 1; + } + return 0; + } + + void __declspec(dllexport) SetWinampHWND(HWND hwnd) + { + winampwnd = hwnd; + } +};
\ No newline at end of file diff --git a/Src/Plugins/Encoder/enc_wma/main.h b/Src/Plugins/Encoder/enc_wma/main.h new file mode 100644 index 00000000..460fb03e --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/main.h @@ -0,0 +1,55 @@ +#include <windows.h> +#include <stdio.h> + +#include "../nsv/enc_if.h" +#include "resource.h" + +// LGIVEN Mods 4-25-05 +// Config info saved in Winamp.ini [enc_wma]---conf=xxxxxxxxxxx +typedef struct +{ + int config_nch; // Number of channels of encoder/fmt selected + int config_bitrate; // Bitrate of encoder/fmt selected + int config_bitsSample; // Bits/Sample of encoder/fmt selected + int config_samplesSec; // Sample rate of encoder/fmt selected + int config_encoder; // Encoder offset in table in Config Dialog + BOOL config_vbr; // VBR or not + DWORD config_passes; // number of passes (1 or 2) +} +configtype; + +typedef struct +{ + configtype cfg; // config type struct + char *configfile; // Name of config file (...\Winamp.ini) +} +configwndrec; + +// Data table values in Config Dialog +// One of these for each format + +struct formatType +{ + wchar_t *formatName; // Format Name (for display) + int offset; // offset in WMEncoder for this Encoder + int nChannels; // number of channels + int bitsSample; // Bits per sample + int samplesSec; // Samples per sec + int bitrate; // Bitrate value + int vbr; +}; + +// One of these for each encoder +struct EncoderType +{ + wchar_t *encoderName; // Encoder name (for display) + int offset; // Offset in WMEncoder + int numFormats; // Number of formats in WMEncoder for this encoder + struct _GUID mediaType; // Media type GUID + BOOL vbr; + DWORD numPasses; + formatType* formats; +}; + + +BOOL CALLBACK ConfigProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); diff --git a/Src/Plugins/Encoder/enc_wma/nserror.h b/Src/Plugins/Encoder/enc_wma/nserror.h new file mode 100644 index 00000000..84d844a4 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/nserror.h @@ -0,0 +1,1631 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1992 - 1999 + +Module Name: + + nserror.mc + +Abstract: + + Definitions for NetShow events. + +Author: + + +Revision History: + +Notes: + + This file is used by the MC tool to generate the nserror.h file + + Add new Ids ONLY in the sections marked **New** + +--*/ + +#ifndef _NSERROR_H +#define _NSERROR_H + + +#define STATUS_SEVERITY(hr) (((hr) >> 30) & 0x3) + + +///////////////////////////////////////////////////////////////////////// +// +// NETSHOW Success Events +// +///////////////////////////////////////////////////////////////////////// + +// +// Values are 32 bit values layed out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-+-+-----------------------+-------------------------------+ +// |Sev|C|R| Facility | Code | +// +---+-+-+-----------------------+-------------------------------+ +// +// where +// +// Sev - is the severity code +// +// 00 - Success +// 01 - Informational +// 10 - Warning +// 11 - Error +// +// C - is the Customer code flag +// +// R - is a reserved bit +// +// Facility - is the facility code +// +// Code - is the facility's status code +// +// +// Define the facility codes +// +#define FACILITY_NS_WIN32 0x7 +#define FACILITY_NS 0xD + + +// +// Define the severity codes +// +#define STATUS_SEVERITY_WARNING 0x2 +#define STATUS_SEVERITY_SUCCESS 0x0 +#define STATUS_SEVERITY_INFORMATIONAL 0x1 +#define STATUS_SEVERITY_ERROR 0x3 + + +// +// MessageId: NS_S_CALLPENDING +// +// MessageText: +// +// The requested operation is pending completion.%0 +// +#define NS_S_CALLPENDING 0x000D0000L + +// +// MessageId: NS_S_CALLABORTED +// +// MessageText: +// +// The requested operation was aborted by the client.%0 +// +#define NS_S_CALLABORTED 0x000D0001L + +// +// MessageId: NS_S_STREAM_TRUNCATED +// +// MessageText: +// +// The stream was purposefully stopped before completion.%0 +// +#define NS_S_STREAM_TRUNCATED 0x000D0002L + + +///////////////////////////////////////////////////////////////////////// +// +// NETSHOW Warning Events +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_W_SERVER_BANDWIDTH_LIMIT +// +// MessageText: +// +// The maximum filebitrate value specified is greater than the server's configured maximum bandwidth.%0 +// +#define NS_W_SERVER_BANDWIDTH_LIMIT 0x800D0003L + +// +// MessageId: NS_W_FILE_BANDWIDTH_LIMIT +// +// MessageText: +// +// The maximum bandwidth value specified is less than the maximum filebitrate.%0 +// +#define NS_W_FILE_BANDWIDTH_LIMIT 0x800D0004L + + +///////////////////////////////////////////////////////////////////////// +// +// NETSHOW Error Events +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_E_NOCONNECTION +// +// MessageText: +// +// There is no connection established with the NetShow server. The operation failed.%0 +// +#define NS_E_NOCONNECTION 0xC00D0005L + +// +// MessageId: NS_E_CANNOTCONNECT +// +// MessageText: +// +// Unable to establish a connection to the server.%0 +// +#define NS_E_CANNOTCONNECT 0xC00D0006L + +// +// MessageId: NS_E_CANNOTDESTROYTITLE +// +// MessageText: +// +// Unable to destroy the title.%0 +// +#define NS_E_CANNOTDESTROYTITLE 0xC00D0007L + +// +// MessageId: NS_E_CANNOTRENAMETITLE +// +// MessageText: +// +// Unable to rename the title.%0 +// +#define NS_E_CANNOTRENAMETITLE 0xC00D0008L + +// +// MessageId: NS_E_CANNOTOFFLINEDISK +// +// MessageText: +// +// Unable to offline disk.%0 +// +#define NS_E_CANNOTOFFLINEDISK 0xC00D0009L + +// +// MessageId: NS_E_CANNOTONLINEDISK +// +// MessageText: +// +// Unable to online disk.%0 +// +#define NS_E_CANNOTONLINEDISK 0xC00D000AL + +// +// MessageId: NS_E_NOREGISTEREDWALKER +// +// MessageText: +// +// There is no file parser registered for this type of file.%0 +// +#define NS_E_NOREGISTEREDWALKER 0xC00D000BL + +// +// MessageId: NS_E_NOFUNNEL +// +// MessageText: +// +// There is no data connection established.%0 +// +#define NS_E_NOFUNNEL 0xC00D000CL + +// +// MessageId: NS_E_NO_LOCALPLAY +// +// MessageText: +// +// Failed to load the local play DLL.%0 +// +#define NS_E_NO_LOCALPLAY 0xC00D000DL + +// +// MessageId: NS_E_NETWORK_BUSY +// +// MessageText: +// +// The network is busy.%0 +// +#define NS_E_NETWORK_BUSY 0xC00D000EL + +// +// MessageId: NS_E_TOO_MANY_SESS +// +// MessageText: +// +// The server session limit was exceeded.%0 +// +#define NS_E_TOO_MANY_SESS 0xC00D000FL + +// +// MessageId: NS_E_ALREADY_CONNECTED +// +// MessageText: +// +// The network connection already exists.%0 +// +#define NS_E_ALREADY_CONNECTED 0xC00D0010L + +// +// MessageId: NS_E_INVALID_INDEX +// +// MessageText: +// +// Index %1 is invalid.%0 +// +#define NS_E_INVALID_INDEX 0xC00D0011L + +// +// MessageId: NS_E_PROTOCOL_MISMATCH +// +// MessageText: +// +// There is no protocol or protocol version supported by both the client and the server.%0 +// +#define NS_E_PROTOCOL_MISMATCH 0xC00D0012L + +// +// MessageId: NS_E_TIMEOUT +// +// MessageText: +// +// There was no timely response from server.%0 +// +#define NS_E_TIMEOUT 0xC00D0013L + +// +// MessageId: NS_E_NET_WRITE +// +// MessageText: +// +// Error writing to the network.%0 +// +#define NS_E_NET_WRITE 0xC00D0014L + +// +// MessageId: NS_E_NET_READ +// +// MessageText: +// +// Error reading from the network.%0 +// +#define NS_E_NET_READ 0xC00D0015L + +// +// MessageId: NS_E_DISK_WRITE +// +// MessageText: +// +// Error writing to a disk.%0 +// +#define NS_E_DISK_WRITE 0xC00D0016L + +// +// MessageId: NS_E_DISK_READ +// +// MessageText: +// +// Error reading from a disk.%0 +// +#define NS_E_DISK_READ 0xC00D0017L + +// +// MessageId: NS_E_FILE_WRITE +// +// MessageText: +// +// Error writing to a file.%0 +// +#define NS_E_FILE_WRITE 0xC00D0018L + +// +// MessageId: NS_E_FILE_READ +// +// MessageText: +// +// Error reading from a file.%0 +// +#define NS_E_FILE_READ 0xC00D0019L + +// +// MessageId: NS_E_FILE_NOT_FOUND +// +// MessageText: +// +// The system cannot find the file specified.%0 +// +#define NS_E_FILE_NOT_FOUND 0xC00D001AL + +// +// MessageId: NS_E_FILE_EXISTS +// +// MessageText: +// +// The file already exists.%0 +// +#define NS_E_FILE_EXISTS 0xC00D001BL + +// +// MessageId: NS_E_INVALID_NAME +// +// MessageText: +// +// The file name, directory name, or volume label syntax is incorrect.%0 +// +#define NS_E_INVALID_NAME 0xC00D001CL + +// +// MessageId: NS_E_FILE_OPEN_FAILED +// +// MessageText: +// +// Failed to open a file.%0 +// +#define NS_E_FILE_OPEN_FAILED 0xC00D001DL + +// +// MessageId: NS_E_FILE_ALLOCATION_FAILED +// +// MessageText: +// +// Unable to allocate a file.%0 +// +#define NS_E_FILE_ALLOCATION_FAILED 0xC00D001EL + +// +// MessageId: NS_E_FILE_INIT_FAILED +// +// MessageText: +// +// Unable to initialize a file.%0 +// +#define NS_E_FILE_INIT_FAILED 0xC00D001FL + +// +// MessageId: NS_E_FILE_PLAY_FAILED +// +// MessageText: +// +// Unable to play a file.%0 +// +#define NS_E_FILE_PLAY_FAILED 0xC00D0020L + +// +// MessageId: NS_E_SET_DISK_UID_FAILED +// +// MessageText: +// +// Could not set the disk UID.%0 +// +#define NS_E_SET_DISK_UID_FAILED 0xC00D0021L + +// +// MessageId: NS_E_INDUCED +// +// MessageText: +// +// An error was induced for testing purposes.%0 +// +#define NS_E_INDUCED 0xC00D0022L + +// +// MessageId: NS_E_CCLINK_DOWN +// +// MessageText: +// +// Two Content Servers failed to communicate.%0 +// +#define NS_E_CCLINK_DOWN 0xC00D0023L + +// +// MessageId: NS_E_INTERNAL +// +// MessageText: +// +// An unknown error occurred.%0 +// +#define NS_E_INTERNAL 0xC00D0024L + +// +// MessageId: NS_E_BUSY +// +// MessageText: +// +// The requested resource is in use.%0 +// +#define NS_E_BUSY 0xC00D0025L + +// +// MessageId: NS_E_UNRECOGNIZED_STREAM_TYPE +// +// MessageText: +// +// The specified stream type is not recognized.%0 +// +#define NS_E_UNRECOGNIZED_STREAM_TYPE 0xC00D0026L + +// +// MessageId: NS_E_NETWORK_SERVICE_FAILURE +// +// MessageText: +// +// The network service provider failed.%0 +// +#define NS_E_NETWORK_SERVICE_FAILURE 0xC00D0027L + +// +// MessageId: NS_E_NETWORK_RESOURCE_FAILURE +// +// MessageText: +// +// An attempt to acquire a network resource failed.%0 +// +#define NS_E_NETWORK_RESOURCE_FAILURE 0xC00D0028L + +// +// MessageId: NS_E_CONNECTION_FAILURE +// +// MessageText: +// +// The network connection has failed.%0 +// +#define NS_E_CONNECTION_FAILURE 0xC00D0029L + +// +// MessageId: NS_E_SHUTDOWN +// +// MessageText: +// +// The session is being terminated locally.%0 +// +#define NS_E_SHUTDOWN 0xC00D002AL + +// +// MessageId: NS_E_INVALID_REQUEST +// +// MessageText: +// +// The request is invalid in the current state.%0 +// +#define NS_E_INVALID_REQUEST 0xC00D002BL + +// +// MessageId: NS_E_INSUFFICIENT_BANDWIDTH +// +// MessageText: +// +// There is insufficient bandwidth available to fulfill the request.%0 +// +#define NS_E_INSUFFICIENT_BANDWIDTH 0xC00D002CL + +// +// MessageId: NS_E_NOT_REBUILDING +// +// MessageText: +// +// The disk is not rebuilding.%0 +// +#define NS_E_NOT_REBUILDING 0xC00D002DL + +// +// MessageId: NS_E_LATE_OPERATION +// +// MessageText: +// +// An operation requested for a particular time could not be carried out on schedule.%0 +// +#define NS_E_LATE_OPERATION 0xC00D002EL + +// +// MessageId: NS_E_INVALID_DATA +// +// MessageText: +// +// Invalid or corrupt data was encountered.%0 +// +#define NS_E_INVALID_DATA 0xC00D002FL + +// +// MessageId: NS_E_FILE_BANDWIDTH_LIMIT +// +// MessageText: +// +// The bandwidth required to stream a file is higher than the maximum file bandwidth allowed on the server.%0 +// +#define NS_E_FILE_BANDWIDTH_LIMIT 0xC00D0030L + +// +// MessageId: NS_E_OPEN_FILE_LIMIT +// +// MessageText: +// +// The client cannot have any more files open simultaneously.%0 +// +#define NS_E_OPEN_FILE_LIMIT 0xC00D0031L + +// +// MessageId: NS_E_BAD_CONTROL_DATA +// +// MessageText: +// +// The server received invalid data from the client on the control connection.%0 +// +#define NS_E_BAD_CONTROL_DATA 0xC00D0032L + +// +// MessageId: NS_E_NO_STREAM +// +// MessageText: +// +// There is no stream available.%0 +// +#define NS_E_NO_STREAM 0xC00D0033L + +// +// MessageId: NS_E_STREAM_END +// +// MessageText: +// +// There is no more data in the stream.%0 +// +#define NS_E_STREAM_END 0xC00D0034L + +// +// MessageId: NS_E_SERVER_NOT_FOUND +// +// MessageText: +// +// The specified server could not be found.%0 +// +#define NS_E_SERVER_NOT_FOUND 0xC00D0035L + +// +// MessageId: NS_E_DUPLICATE_NAME +// +// MessageText: +// +// The specified name is already in use. +// +#define NS_E_DUPLICATE_NAME 0xC00D0036L + +// +// MessageId: NS_E_DUPLICATE_ADDRESS +// +// MessageText: +// +// The specified address is already in use. +// +#define NS_E_DUPLICATE_ADDRESS 0xC00D0037L + +// +// MessageId: NS_E_BAD_MULTICAST_ADDRESS +// +// MessageText: +// +// The specified address is not a valid multicast address. +// +#define NS_E_BAD_MULTICAST_ADDRESS 0xC00D0038L + +// +// MessageId: NS_E_BAD_ADAPTER_ADDRESS +// +// MessageText: +// +// The specified adapter address is invalid. +// +#define NS_E_BAD_ADAPTER_ADDRESS 0xC00D0039L + +// +// MessageId: NS_E_BAD_DELIVERY_MODE +// +// MessageText: +// +// The specified delivery mode is invalid. +// +#define NS_E_BAD_DELIVERY_MODE 0xC00D003AL + +// +// MessageId: NS_E_INVALID_CHANNEL +// +// MessageText: +// +// The specified station does not exist. +// +#define NS_E_INVALID_CHANNEL 0xC00D003BL + +// +// MessageId: NS_E_INVALID_STREAM +// +// MessageText: +// +// The specified stream does not exist. +// +#define NS_E_INVALID_STREAM 0xC00D003CL + +// +// MessageId: NS_E_INVALID_ARCHIVE +// +// MessageText: +// +// The specified archive could not be opened. +// +#define NS_E_INVALID_ARCHIVE 0xC00D003DL + +// +// MessageId: NS_E_NOTITLES +// +// MessageText: +// +// The system cannot find any titles on the server.%0 +// +#define NS_E_NOTITLES 0xC00D003EL + +// +// MessageId: NS_E_INVALID_CLIENT +// +// MessageText: +// +// The system cannot find the client specified.%0 +// +#define NS_E_INVALID_CLIENT 0xC00D003FL + +// +// MessageId: NS_E_INVALID_BLACKHOLE_ADDRESS +// +// MessageText: +// +// The Blackhole Address is not initialized.%0 +// +#define NS_E_INVALID_BLACKHOLE_ADDRESS 0xC00D0040L + +// +// MessageId: NS_E_INCOMPATIBLE_FORMAT +// +// MessageText: +// +// The station does not support the stream format. +// +#define NS_E_INCOMPATIBLE_FORMAT 0xC00D0041L + +// +// MessageId: NS_E_INVALID_KEY +// +// MessageText: +// +// The specified key is not valid. +// +#define NS_E_INVALID_KEY 0xC00D0042L + +// +// MessageId: NS_E_INVALID_PORT +// +// MessageText: +// +// The specified port is not valid. +// +#define NS_E_INVALID_PORT 0xC00D0043L + +// +// MessageId: NS_E_INVALID_TTL +// +// MessageText: +// +// The specified TTL is not valid. +// +#define NS_E_INVALID_TTL 0xC00D0044L + +// +// MessageId: NS_E_STRIDE_REFUSED +// +// MessageText: +// +// The request to fast forward or rewind could not be fulfilled. +// +#define NS_E_STRIDE_REFUSED 0xC00D0045L + +// +// IMmsAutoServer Errors +// +// +// MessageId: NS_E_MMSAUTOSERVER_CANTFINDWALKER +// +// MessageText: +// +// Unable to load the appropriate file parser.%0 +// +#define NS_E_MMSAUTOSERVER_CANTFINDWALKER 0xC00D0046L + +// +// MessageId: NS_E_MAX_BITRATE +// +// MessageText: +// +// Cannot exceed the maximum bandwidth limit.%0 +// +#define NS_E_MAX_BITRATE 0xC00D0047L + +// +// MessageId: NS_E_LOGFILEPERIOD +// +// MessageText: +// +// Invalid value for LogFilePeriod.%0 +// +#define NS_E_LOGFILEPERIOD 0xC00D0048L + +// +// MessageId: NS_E_MAX_CLIENTS +// +// MessageText: +// +// Cannot exceed the maximum client limit.%0 +// +// +#define NS_E_MAX_CLIENTS 0xC00D0049L + +// +// MessageId: NS_E_LOG_FILE_SIZE +// +// MessageText: +// +// Log File Size too small.%0 +// +// +#define NS_E_LOG_FILE_SIZE 0xC00D004AL + +// +// MessageId: NS_E_MAX_FILERATE +// +// MessageText: +// +// Cannot exceed the maximum file rate.%0 +// +#define NS_E_MAX_FILERATE 0xC00D004BL + +// +// File Walker Errors +// +// +// MessageId: NS_E_WALKER_UNKNOWN +// +// MessageText: +// +// Unknown file type.%0 +// +#define NS_E_WALKER_UNKNOWN 0xC00D004CL + +// +// MessageId: NS_E_WALKER_SERVER +// +// MessageText: +// +// The specified file, %1, cannot be loaded onto the specified server, %2.%0 +// +#define NS_E_WALKER_SERVER 0xC00D004DL + +// +// MessageId: NS_E_WALKER_USAGE +// +// MessageText: +// +// There was a usage error with file parser.%0 +// +#define NS_E_WALKER_USAGE 0xC00D004EL + + +///////////////////////////////////////////////////////////////////////// +// +// NETSHOW Monitor Events +// +///////////////////////////////////////////////////////////////////////// + + + // Tiger Events + + // %1 is the tiger name + +// +// MessageId: NS_I_TIGER_START +// +// MessageText: +// +// The Title Server %1 is running.%0 +// +#define NS_I_TIGER_START 0x400D004FL + +// +// MessageId: NS_E_TIGER_FAIL +// +// MessageText: +// +// The Title Server %1 has failed.%0 +// +#define NS_E_TIGER_FAIL 0xC00D0050L + + + // Cub Events + + // %1 is the cub ID + // %2 is the cub name + +// +// MessageId: NS_I_CUB_START +// +// MessageText: +// +// Content Server %1 (%2) is starting.%0 +// +#define NS_I_CUB_START 0x400D0051L + +// +// MessageId: NS_I_CUB_RUNNING +// +// MessageText: +// +// Content Server %1 (%2) is running.%0 +// +#define NS_I_CUB_RUNNING 0x400D0052L + +// +// MessageId: NS_E_CUB_FAIL +// +// MessageText: +// +// Content Server %1 (%2) has failed.%0 +// +#define NS_E_CUB_FAIL 0xC00D0053L + + + // Disk Events + + // %1 is the tiger disk ID + // %2 is the device name + // %3 is the cub ID +// +// MessageId: NS_I_DISK_START +// +// MessageText: +// +// Disk %1 ( %2 ) on Content Server %3, is running.%0 +// +#define NS_I_DISK_START 0x400D0054L + +// +// MessageId: NS_E_DISK_FAIL +// +// MessageText: +// +// Disk %1 ( %2 ) on Content Server %3, has failed.%0 +// +#define NS_E_DISK_FAIL 0xC00D0055L + +// +// MessageId: NS_I_DISK_REBUILD_STARTED +// +// MessageText: +// +// Started rebuilding disk %1 ( %2 ) on Content Server %3.%0 +// +#define NS_I_DISK_REBUILD_STARTED 0x400D0056L + +// +// MessageId: NS_I_DISK_REBUILD_FINISHED +// +// MessageText: +// +// Finished rebuilding disk %1 ( %2 ) on Content Server %3.%0 +// +#define NS_I_DISK_REBUILD_FINISHED 0x400D0057L + +// +// MessageId: NS_I_DISK_REBUILD_ABORTED +// +// MessageText: +// +// Aborted rebuilding disk %1 ( %2 ) on Content Server %3.%0 +// +#define NS_I_DISK_REBUILD_ABORTED 0x400D0058L + + + // Admin Events + +// +// MessageId: NS_I_LIMIT_FUNNELS +// +// MessageText: +// +// A NetShow administrator at network location %1 set the data stream limit to %2 streams.%0 +// +#define NS_I_LIMIT_FUNNELS 0x400D0059L + +// +// MessageId: NS_I_START_DISK +// +// MessageText: +// +// A NetShow administrator at network location %1 started disk %2.%0 +// +#define NS_I_START_DISK 0x400D005AL + +// +// MessageId: NS_I_STOP_DISK +// +// MessageText: +// +// A NetShow administrator at network location %1 stopped disk %2.%0 +// +#define NS_I_STOP_DISK 0x400D005BL + +// +// MessageId: NS_I_STOP_CUB +// +// MessageText: +// +// A NetShow administrator at network location %1 stopped Content Server %2.%0 +// +#define NS_I_STOP_CUB 0x400D005CL + +// +// MessageId: NS_I_KILL_VIEWER +// +// MessageText: +// +// A NetShow administrator at network location %1 disconnected viewer %2 from the system.%0 +// +#define NS_I_KILL_VIEWER 0x400D005DL + +// +// MessageId: NS_I_REBUILD_DISK +// +// MessageText: +// +// A NetShow administrator at network location %1 started rebuilding disk %2.%0 +// +#define NS_I_REBUILD_DISK 0x400D005EL + +// +// MessageId: NS_W_UNKNOWN_EVENT +// +// MessageText: +// +// Unknown %1 event encountered.%0 +// +#define NS_W_UNKNOWN_EVENT 0x800D005FL + + + // Alerts + +// +// MessageId: NS_E_MAX_FUNNELS_ALERT +// +// MessageText: +// +// The NetShow data stream limit of %1 streams was reached.%0 +// +#define NS_E_MAX_FUNNELS_ALERT 0xC00D0060L + +// +// MessageId: NS_E_ALLOCATE_FILE_FAIL +// +// MessageText: +// +// The NetShow Video Server was unable to allocate a %1 block file named %2.%0 +// +#define NS_E_ALLOCATE_FILE_FAIL 0xC00D0061L + +// +// MessageId: NS_E_PAGING_ERROR +// +// MessageText: +// +// A Content Server was unable to page a block.%0 +// +#define NS_E_PAGING_ERROR 0xC00D0062L + +// +// MessageId: NS_E_BAD_BLOCK0_VERSION +// +// MessageText: +// +// Disk %1 has unrecognized control block version %2.%0 +// +#define NS_E_BAD_BLOCK0_VERSION 0xC00D0063L + +// +// MessageId: NS_E_BAD_DISK_UID +// +// MessageText: +// +// Disk %1 has incorrect uid %2.%0 +// +#define NS_E_BAD_DISK_UID 0xC00D0064L + +// +// MessageId: NS_E_BAD_FSMAJOR_VERSION +// +// MessageText: +// +// Disk %1 has unsupported file system major version %2.%0 +// +#define NS_E_BAD_FSMAJOR_VERSION 0xC00D0065L + +// +// MessageId: NS_E_BAD_STAMPNUMBER +// +// MessageText: +// +// Disk %1 has bad stamp number in control block.%0 +// +#define NS_E_BAD_STAMPNUMBER 0xC00D0066L + +// +// MessageId: NS_E_PARTIALLY_REBUILT_DISK +// +// MessageText: +// +// Disk %1 is partially reconstructed.%0 +// +#define NS_E_PARTIALLY_REBUILT_DISK 0xC00D0067L + +// +// MessageId: NS_E_ENACTPLAN_GIVEUP +// +// MessageText: +// +// EnactPlan gives up.%0 +// +#define NS_E_ENACTPLAN_GIVEUP 0xC00D0068L + + + // MCMADM warnings/errors + +// +// MessageId: MCMADM_I_NO_EVENTS +// +// MessageText: +// +// Event initialization failed, there will be no MCM events.%0 +// +#define MCMADM_I_NO_EVENTS 0x400D0069L + +// +// MessageId: MCMADM_E_REGKEY_NOT_FOUND +// +// MessageText: +// +// The key was not found in the registry.%0 +// +#define MCMADM_E_REGKEY_NOT_FOUND 0xC00D006AL + +// +// MessageId: NS_E_NO_FORMATS +// +// MessageText: +// +// No stream formats were found in an NSC file.%0 +// +#define NS_E_NO_FORMATS 0xC00D006BL + +// +// MessageId: NS_E_NO_REFERENCES +// +// MessageText: +// +// No reference URLs were found in an ASX file.%0 +// +#define NS_E_NO_REFERENCES 0xC00D006CL + +// +// MessageId: NS_E_WAVE_OPEN +// +// MessageText: +// +// Error opening wave device, the device might be in use.%0 +// +#define NS_E_WAVE_OPEN 0xC00D006DL + +// +// MessageId: NS_I_LOGGING_FAILED +// +// MessageText: +// +// The logging operation failed. +// +#define NS_I_LOGGING_FAILED 0x400D006EL + +// +// MessageId: NS_E_CANNOTCONNECTEVENTS +// +// MessageText: +// +// Unable to establish a connection to the NetShow event monitor service.%0 +// +#define NS_E_CANNOTCONNECTEVENTS 0xC00D006FL + +// +// MessageId: NS_I_LIMIT_BANDWIDTH +// +// MessageText: +// +// A NetShow administrator at network location %1 set the maximum bandwidth limit to %2 bps.%0 +// +#define NS_I_LIMIT_BANDWIDTH 0x400D0070L + +// +// MessageId: NS_E_NOTHING_TO_DO +// +// MessageText: +// +// NS_E_NOTHING_TO_DO +// +#define NS_E_NOTHING_TO_DO 0xC00D07F1L + +// +// MessageId: NS_E_NO_MULTICAST +// +// MessageText: +// +// NS_E_NO_MULTICAST +// +#define NS_E_NO_MULTICAST 0xC00D07F2L + + +///////////////////////////////////////////////////////////////////////// +// +// **New** NETSHOW Error Events +// +// IdRange = 200..399 +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_E_MONITOR_GIVEUP +// +// MessageText: +// +// Netshow Events Monitor is not operational and has been disconnected.%0 +// +#define NS_E_MONITOR_GIVEUP 0xC00D00C8L + +// +// MessageId: NS_E_REMIRRORED_DISK +// +// MessageText: +// +// Disk %1 is remirrored.%0 +// +#define NS_E_REMIRRORED_DISK 0xC00D00C9L + +// +// MessageId: NS_E_INSUFFICIENT_DATA +// +// MessageText: +// +// Insufficient data found.%0 +// +#define NS_E_INSUFFICIENT_DATA 0xC00D00CAL + +// +// MessageId: NS_E_ASSERT +// +// MessageText: +// +// %1 failed in file %2 line %3.%0 +// +#define NS_E_ASSERT 0xC00D00CBL + +// +// MessageId: NS_E_BAD_ADAPTER_NAME +// +// MessageText: +// +// The specified adapter name is invalid.%0 +// +#define NS_E_BAD_ADAPTER_NAME 0xC00D00CCL + +// +// MessageId: NS_E_NOT_LICENSED +// +// MessageText: +// +// The application is not licensed for this feature.%0 +// +#define NS_E_NOT_LICENSED 0xC00D00CDL + +// +// MessageId: NS_E_NO_SERVER_CONTACT +// +// MessageText: +// +// Unable to contact the server.%0 +// +#define NS_E_NO_SERVER_CONTACT 0xC00D00CEL + +// +// MessageId: NS_E_TOO_MANY_TITLES +// +// MessageText: +// +// Maximum number of titles exceeded.%0 +// +#define NS_E_TOO_MANY_TITLES 0xC00D00CFL + +// +// MessageId: NS_E_TITLE_SIZE_EXCEEDED +// +// MessageText: +// +// Maximum size of a title exceeded.%0 +// +#define NS_E_TITLE_SIZE_EXCEEDED 0xC00D00D0L + +// +// MessageId: NS_E_UDP_DISABLED +// +// MessageText: +// +// UDP protocol not enabled. Not trying %1!ls!.%0 +// +#define NS_E_UDP_DISABLED 0xC00D00D1L + +// +// MessageId: NS_E_TCP_DISABLED +// +// MessageText: +// +// TCP protocol not enabled. Not trying %1!ls!.%0 +// +#define NS_E_TCP_DISABLED 0xC00D00D2L + +// +// MessageId: NS_E_HTTP_DISABLED +// +// MessageText: +// +// HTTP protocol not enabled. Not trying %1!ls!.%0 +// +#define NS_E_HTTP_DISABLED 0xC00D00D3L + +// +// MessageId: NS_E_LICENSE_EXPIRED +// +// MessageText: +// +// The product license has expired.%0 +// +#define NS_E_LICENSE_EXPIRED 0xC00D00D4L + +// +// MessageId: NS_E_TITLE_BITRATE +// +// MessageText: +// +// Source file exceeds the per title maximum bitrate. See NetShow Theater documentation for more information.%0 +// +#define NS_E_TITLE_BITRATE 0xC00D00D5L + +// +// MessageId: NS_E_EMPTY_PROGRAM_NAME +// +// MessageText: +// +// The program name cannot be empty.%0 +// +#define NS_E_EMPTY_PROGRAM_NAME 0xC00D00D6L + +// +// MessageId: NS_E_MISSING_CHANNEL +// +// MessageText: +// +// Station %1 does not exist.%0 +// +#define NS_E_MISSING_CHANNEL 0xC00D00D7L + +// +// MessageId: NS_E_NO_CHANNELS +// +// MessageText: +// +// You need to define at least one station before this operation can complete.%0 +// +#define NS_E_NO_CHANNELS 0xC00D00D8L + + +///////////////////////////////////////////////////////////////////////// +// +// **New** NETSHOW Monitor Events +// +// IdRange = 400..599 +// +// Admin Events: +// +// Alerts: +// +// Title Server: +// %1 is the Title Server name +// +// Content Server: +// %1 is the Content Server ID +// %2 is the Content Server name +// %3 is the Peer Content Server name (optional) +// +// Disks: +// %1 is the Title Server disk ID +// %2 is the device name +// %3 is the Content Server ID +// +;///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_E_CUB_FAIL_LINK +// +// MessageText: +// +// Content Server %1 (%2) has failed its link to Content Server %3.%0 +// +#define NS_E_CUB_FAIL_LINK 0xC00D0190L + +// +// MessageId: NS_I_CUB_UNFAIL_LINK +// +// MessageText: +// +// Content Server %1 (%2) has established its link to Content Server %3.%0 +// +#define NS_I_CUB_UNFAIL_LINK 0x400D0191L + +// +// MessageId: NS_E_BAD_CUB_UID +// +// MessageText: +// +// Content Server %1 (%2) has incorrect uid %3.%0 +// +#define NS_E_BAD_CUB_UID 0xC00D0192L + +// +// MessageId: NS_I_RESTRIPE_START +// +// MessageText: +// +// Restripe operation has started.%0 +// +#define NS_I_RESTRIPE_START 0x400D0193L + +// +// MessageId: NS_I_RESTRIPE_DONE +// +// MessageText: +// +// Restripe operation has completed.%0 +// +#define NS_I_RESTRIPE_DONE 0x400D0194L + +// +// MessageId: NS_E_GLITCH_MODE +// +// MessageText: +// +// Server unreliable because multiple components failed.%0 +// +#define NS_E_GLITCH_MODE 0xC00D0195L + +// +// MessageId: NS_I_RESTRIPE_DISK_OUT +// +// MessageText: +// +// Content disk %1 (%2) on Content Server %3 has been restriped out.%0 +// +#define NS_I_RESTRIPE_DISK_OUT 0x400D0196L + +// +// MessageId: NS_I_RESTRIPE_CUB_OUT +// +// MessageText: +// +// Content server %1 (%2) has been restriped out.%0 +// +#define NS_I_RESTRIPE_CUB_OUT 0x400D0197L + +// +// MessageId: NS_I_DISK_STOP +// +// MessageText: +// +// Disk %1 ( %2 ) on Content Server %3, has been offlined.%0 +// +#define NS_I_DISK_STOP 0x400D0198L + +// +// MessageId: NS_I_CATATONIC_FAILURE +// +// MessageText: +// +// Disk %1 ( %2 ) on Content Server %3, will be failed because it is catatonic.%0 +// +#define NS_I_CATATONIC_FAILURE 0x800D0199L + +// +// MessageId: NS_I_CATATONIC_AUTO_UNFAIL +// +// MessageText: +// +// Disk %1 ( %2 ) on Content Server %3, auto online from catatonic state.%0 +// +#define NS_I_CATATONIC_AUTO_UNFAIL 0x800D019AL + +// +// MessageId: NS_E_NO_MEDIA_PROTOCOL +// +// MessageText: +// +// Content Server %1 (%2) is unable to communicate with the Media System Network Protocol.%0 +// +#define NS_E_NO_MEDIA_PROTOCOL 0xC00D019BL + + + +///////////////////////////////////////////////////////////////////////// +// +// **New** NETSHOW IMmsAutoServer Errors +// +// IdRange = 600..799 +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_E_INITIAL +// +// MessageText: +// +// Placeholder.%0 +// +#define NS_E_INITIAL 0xC00D0258L + + +///////////////////////////////////////////////////////////////////////// +// +// **New** MCMADM warnings/errors +// +// IdRange = 1000..1199 +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: MCMADM_E_INITIAL +// +// MessageText: +// +// Placeholder.%0 +// +#define MCMADM_E_INITIAL 0xC00D03E8L + + +// +// Advanced Streaming Format (ASF) codes occupy MessageIds 2000-2999 +// +// See ASFErr.mc for more details - please do not define any symbols +// in that range in this file. +// + + +///////////////////////////////////////////////////////////////////////// +// +// Windows Media Audio SDK Errors +// +// IdRange = 3000-3199 +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_E_INVALID_INPUT_FORMAT +// +// MessageText: +// +// The input audio format must be a valid, PCM audio format.%0 +// +#define NS_E_INVALID_INPUT_FORMAT 0xC00D0BB8L + +// +// MessageId: NS_E_MSAUDIO_NOT_INSTALLED +// +// MessageText: +// +// The MSAudio codec is not installed on this system.%0 +// +#define NS_E_MSAUDIO_NOT_INSTALLED 0xC00D0BB9L + +// +// MessageId: NS_E_UNEXPECTED_MSAUDIO_ERROR +// +// MessageText: +// +// An unexpected error occured with the MSAudio codec.%0 +// +#define NS_E_UNEXPECTED_MSAUDIO_ERROR 0xC00D0BBAL + +// +// MessageId: NS_E_INVALID_OUTPUT_FORMAT +// +// MessageText: +// +// The MSAudio codec does not support the specified output format.%0 +// +#define NS_E_INVALID_OUTPUT_FORMAT 0xC00D0BBBL + +// +// MessageId: NS_E_NOT_CONFIGURED +// +// MessageText: +// +// The object must be fully configured before audio samples can be processed.%0 +// +#define NS_E_NOT_CONFIGURED 0xC00D0BBCL + +// +// MessageId: NS_E_PROTECTED_CONTENT +// +// MessageText: +// +// The content is protected and cannot be opened at this time.%0 +// +#define NS_E_PROTECTED_CONTENT 0xC00D0BBDL + +// +// MessageId: NS_E_LICENSE_REQUIRED +// +// MessageText: +// +// A playback license is required to open this content.%0 +// +#define NS_E_LICENSE_REQUIRED 0xC00D0BBEL + +// +// MessageId: NS_E_TAMPERED_CONTENT +// +// MessageText: +// +// This content has been tampered with and cannot be opened.%0 +// +#define NS_E_TAMPERED_CONTENT 0xC00D0BBFL + +// +// MessageId: NS_E_LICENSE_OUTOFDATE +// +// MessageText: +// +// The license is to open this content has expired.%0 +// +#define NS_E_LICENSE_OUTOFDATE 0xC00D0BC0L + +// +// MessageId: NS_E_LICENSE_INCORRECT_RIGHTS +// +// MessageText: +// +// The requested rights prevent the content from being opened.%0 +// +#define NS_E_LICENSE_INCORRECT_RIGHTS 0xC00D0BC1L + + +///////////////////////////////////////////////////////////////////////// +// +// **New** NETSHOW Warning Events +// +// IdRange = 10000 +// +///////////////////////////////////////////////////////////////////////// + +// +// MessageId: NS_W_INITIAL +// +// MessageText: +// +// Placeholder.%0 +// +#define NS_W_INITIAL 0x800D2710L + + +#endif _NSERROR_H + diff --git a/Src/Plugins/Encoder/enc_wma/resource.h b/Src/Plugins/Encoder/enc_wma/resource.h new file mode 100644 index 00000000..61332778 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/resource.h @@ -0,0 +1,57 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Script1.rc +// +#define IDS_CANNOT_FIND_INPUT_FORMATTER 0 +#define IDS_WARNING 1 +#define IDOK2 2 +#define IDS_CANNOT_ALLOCATE_MEM 2 +#define IDS_WMA_ENCODER_ERROR 3 +#define IDS_CANNOT_GET_STRUCTURE 4 +#define IDS_CANNOT_GET_ENCODER4_INFO 5 +#define IDS_SAVE_PROFILE_READ_ERROR 6 +#define IDS_MEM_ALLOCATION_ERROR 7 +#define IDS_PROFILE_SAVE_SIZE_ERROR 8 +#define IDS_CANNOT_READ_AUDIO_STREAM 9 +#define IDS_CANNOT_GET_CODEC_INFO 10 +#define IDS_CANNOT_CREATE_A_PROFILE 11 +#define IDS_CANNOT_CREATE_PROFILE_MANAGER 12 +#define IDS_WMA_CONFIG_FILE_ERROR 13 +#define IDS_CBR 16 +#define IDS_2_PASS_CBR 17 +#define IDS_VBR 18 +#define IDS_ABR 19 +#define IDS_MONO_INFO 20 +#define IDS_STEREO_INFO 21 +#define IDS_CHANNELS_INFO 22 +#define IDS_QUALITY 23 +#define IDS_BITRATE 24 +#define IDS_ENC_WMA_DESC 25 +#define IDD_DIALOG1 101 +#define IDC_DIR 1000 +#define IDC_SRATE 1001 +#define IDC_BRATE 1002 +#define IDC_NCH 1003 +#define IDC_PROFILE 1004 +#define IDC_ABRATE 1005 +#define IDC_CBR 1005 +#define IDC_ENCODER 1006 +#define IDC_BPSAMPLE 1007 +#define IDC_VBR 1008 +#define IDC_1PASS 1009 +#define IDC_RADIO4 1010 +#define IDC_2PASS 1010 +#define IDC_STATIC_BITRATE 1011 +#define IDC_SAMPLE_FORMAT 1012 +#define IDC_COMBO1 1013 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1014 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/Plugins/Encoder/enc_wma/version.rc2 b/Src/Plugins/Encoder/enc_wma/version.rc2 new file mode 100644 index 00000000..d3cf0a16 --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/version.rc2 @@ -0,0 +1,39 @@ + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#include "../../../Winamp/buildType.h" +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,23,0,0 + PRODUCTVERSION WINAMP_PRODUCTVER + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Encoder Plug-in" + VALUE "FileVersion", "1,23,0,0" + VALUE "InternalName", "Nullsoft WMA Encoder" + VALUE "LegalCopyright", "Copyright © 2006-2023 Winamp SA" + VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA" + VALUE "OriginalFilename", "enc_wma.dll" + VALUE "ProductName", "Winamp" + VALUE "ProductVersion", STR_WINAMP_PRODUCTVER + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Src/Plugins/Encoder/enc_wma/wmaudiosdk.h b/Src/Plugins/Encoder/enc_wma/wmaudiosdk.h new file mode 100644 index 00000000..99199d9d --- /dev/null +++ b/Src/Plugins/Encoder/enc_wma/wmaudiosdk.h @@ -0,0 +1,1009 @@ +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + +/* File created by MIDL compiler version 3.01.75 */ +/* at Mon Aug 09 13:10:31 1999 + */ +/* Compiler settings for .\wmaudiosdk.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext + error checks: none +*/ +//@@MIDL_FILE_HEADING( ) +#include "rpc.h" +#include "rpcndr.h" +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __wmaudiosdk_h__ +#define __wmaudiosdk_h__ + +#ifdef __cplusplus +extern "C"{ +#endif + +/* Forward Declarations */ + +#ifndef __IWMAudioWriter_FWD_DEFINED__ +#define __IWMAudioWriter_FWD_DEFINED__ +typedef interface IWMAudioWriter IWMAudioWriter; +#endif /* __IWMAudioWriter_FWD_DEFINED__ */ + + +#ifndef __IWMAudioReader_FWD_DEFINED__ +#define __IWMAudioReader_FWD_DEFINED__ +typedef interface IWMAudioReader IWMAudioReader; +#endif /* __IWMAudioReader_FWD_DEFINED__ */ + + +#ifndef __IWMAudioReadCallback_FWD_DEFINED__ +#define __IWMAudioReadCallback_FWD_DEFINED__ +typedef interface IWMAudioReadCallback IWMAudioReadCallback; +#endif /* __IWMAudioReadCallback_FWD_DEFINED__ */ + + +#ifndef __IWMAudioInfo_FWD_DEFINED__ +#define __IWMAudioInfo_FWD_DEFINED__ +typedef interface IWMAudioInfo IWMAudioInfo; +#endif /* __IWMAudioInfo_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" + +void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); +void __RPC_USER MIDL_user_free( void __RPC_FAR * ); + +/**************************************** + * Generated header for interface: __MIDL_itf_wmaudiosdk_0000 + * at Mon Aug 09 13:10:31 1999 + * using MIDL 3.01.75 + ****************************************/ +/* [local] */ + + +//========================================================================= +// +// THIS SOFTWARE HAS BEEN LICENSED FROM MICROSOFT CORPORATION PURSUANT +// TO THE TERMS OF AN END USER LICENSE AGREEMENT ("EULA"). +// PLEASE REFER TO THE TEXT OF THE EULA TO DETERMINE THE RIGHTS TO USE THE SOFTWARE. +// +// Copyright (C) Microsoft Corporation, 1996 - 1999 All Rights Reserved. +// +//========================================================================= +typedef struct tWAVEFORMATEX WAVEFORMATEX; + + + + +#include "nserror.h" +#include "asferr.h" +EXTERN_GUID( IID_IWMAudioWriter, 0x1A5636F1, 0xDB5E, 0x11d2, 0x9D, 0x41, 0x00, 0x60, 0x08, 0x31, 0x78, 0xAF ); +EXTERN_GUID( IID_IWMAudioReader, 0x1A5636F2, 0xDB5E, 0x11d2, 0x9D, 0x41, 0x00, 0x60, 0x08, 0x31, 0x78, 0xAF ); +EXTERN_GUID( IID_IWMAudioReadCallback, 0x1A5636F3, 0xDB5E, 0x11d2, 0x9D, 0x41, 0x00, 0x60, 0x08, 0x31, 0x78, 0xAF ); +EXTERN_GUID( IID_IWMAudioInfo, 0xaa139f0, 0xf6a8, 0x11d2, 0x97, 0xf7, 0x0, 0xa0, 0xc9, 0x5e, 0xa8, 0x50 ); +#define WMT_SAMPLE_MUSIC 0 +#define WMT_SAMPLE_SPEECH 0xFFFFFFFF +//////////////////////////////////////////////////////////////// +// +// These are the special case attributes that give information +// about the ASF file. +// +static const DWORD g_dwWMASpecialAttributes = 7; +static const WCHAR *g_wszWMADuration = L"Duration"; +static const WCHAR *g_wszWMABitrate = L"Bitrate"; +static const WCHAR *g_wszWMASeekable = L"Seekable"; +static const WCHAR *g_wszWMABroadcast = L"Broadcast"; +static const WCHAR *g_wszWMAProtected = L"Is_Protected"; +static const WCHAR *g_wszWMATrusted = L"Is_Trusted"; +static const WCHAR *g_wszWMASignature_Name = L"Signature_Name"; + +//////////////////////////////////////////////////////////////// +// +// The content description object supports 5 basic attributes. +// +static const DWORD g_dwWMAContentAttributes = 5; +static const WCHAR *g_wszWMATitle = L"Title"; +static const WCHAR *g_wszWMAAuthor = L"Author"; +static const WCHAR *g_wszWMADescription = L"Description"; +static const WCHAR *g_wszWMARating = L"Rating"; +static const WCHAR *g_wszWMACopyright = L"Copyright"; + +//////////////////////////////////////////////////////////////// +// +// These attributes are used to set DRM properties on an ASF. +// +static const WCHAR *g_wszWMAUse_DRM = L"Use_DRM"; +static const WCHAR *g_wszWMADRM_Flags = L"DRM_Flags"; +static const WCHAR *g_wszWMADRM_Level = L"DRM_Level"; + +//////////////////////////////////////////////////////////////// +// +// These are the additional attributes defined in the ASF attribute +// namespace that gives information about the content in the ASF file. +// +static const WCHAR *g_wszWMAAlbumTitle = L"WM/AlbumTitle"; +static const WCHAR *g_wszWMATrack = L"WM/Track"; +static const WCHAR *g_wszWMAPromotionURL = L"WM/PromotionURL"; +static const WCHAR *g_wszWMAAlbumCoverURL = L"WM/AlbumCoverURL"; +static const WCHAR *g_wszWMAGenre = L"WM/Genre"; +static const WCHAR *g_wszWMAYear = L"WM/Year"; + +HRESULT STDMETHODCALLTYPE WMAudioCreateWriter( LPCWSTR pszFilename, IWMAudioWriter **ppIWMAudioWriter ); +HRESULT STDMETHODCALLTYPE WMAudioCreateReader( LPCWSTR pszFilename, IWMAudioReadCallback *pIWMReadCallback, IWMAudioReader **ppIWMAudioReader, void *pvReserved ); +HRESULT STDMETHODCALLTYPE WMAudioCreateInfo( LPCWSTR pszFilename, IWMAudioInfo **ppIWMAudioInfo ); + +/* + + // Already defined in wmsdk.h + +typedef +enum WMT_STATUS + { WMT_ERROR = 0, + WMT_BUFFERING_START = 1, + WMT_BUFFERING_STOP = 2, + WMT_EOF = 3, + WMT_LOCATING = 4, + WMT_CONNECTING = 5, + WMT_NO_RIGHTS = 6, + WMT_MISSING_CODEC = 7 + } WMT_STATUS; + +typedef +enum WMT_ATTR_DATATYPE + { WMT_TYPE_DWORD = 0, + WMT_TYPE_STRING = 1, + WMT_TYPE_BINARY = 2, + WMT_TYPE_BOOL = 3 + } WMT_ATTR_DATATYPE; + +typedef +enum WMT_RIGHTS + { WMT_RIGHT_PLAYBACK = 0x1, + WMT_RIGHT_COPY_TO_PORTABLE = 0x2, + WMT_RIGHT_COPY_TO_CD = 0x8 + } WMT_RIGHTS; + +typedef +enum WMT_AUDIO_OPTIONS + { WMT_OPTION_DEFAULT = 0 + } WMT_AUDIO_OPTIONS; +*/ + + +extern RPC_IF_HANDLE __MIDL_itf_wmaudiosdk_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_wmaudiosdk_0000_v0_0_s_ifspec; + +#ifndef __IWMAudioWriter_INTERFACE_DEFINED__ +#define __IWMAudioWriter_INTERFACE_DEFINED__ + +/**************************************** + * Generated header for interface: IWMAudioWriter + * at Mon Aug 09 13:10:31 1999 + * using MIDL 3.01.75 + ****************************************/ +/* [local][unique][helpstring][uuid][object] */ + + + +EXTERN_C const IID IID_IWMAudioWriter; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + interface DECLSPEC_UUID("1A5636F1-DB5E-11d2-9D41-0060083178AF") + IWMAudioWriter : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SetAttribute( + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetInputFormat( + /* [in] */ const WAVEFORMATEX __RPC_FAR *pWfx) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetOutputFormat( + /* [in] */ DWORD dwBitrate, + /* [in] */ DWORD dwSampleRate, + /* [in] */ DWORD dwNumChannels, + /* [in] */ DWORD dwAudioOptions) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetOutputFormat( + /* [out] */ DWORD __RPC_FAR *pdwBitrate, + /* [out] */ DWORD __RPC_FAR *pdwSampleRate, + /* [out] */ DWORD __RPC_FAR *pdwNumChannels, + /* [out] */ DWORD __RPC_FAR *pdwAudioOptions) = 0; + + virtual HRESULT STDMETHODCALLTYPE WriteSample( + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData) = 0; + + virtual HRESULT STDMETHODCALLTYPE Flush( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IWMAudioWriterVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IWMAudioWriter __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IWMAudioWriter __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetAttribute )( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetInputFormat )( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ const WAVEFORMATEX __RPC_FAR *pWfx); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetOutputFormat )( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ DWORD dwBitrate, + /* [in] */ DWORD dwSampleRate, + /* [in] */ DWORD dwNumChannels, + /* [in] */ DWORD dwAudioOptions); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetOutputFormat )( + IWMAudioWriter __RPC_FAR * This, + /* [out] */ DWORD __RPC_FAR *pdwBitrate, + /* [out] */ DWORD __RPC_FAR *pdwSampleRate, + /* [out] */ DWORD __RPC_FAR *pdwNumChannels, + /* [out] */ DWORD __RPC_FAR *pdwAudioOptions); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *WriteSample )( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Flush )( + IWMAudioWriter __RPC_FAR * This); + + END_INTERFACE + } IWMAudioWriterVtbl; + + interface IWMAudioWriter + { + CONST_VTBL struct IWMAudioWriterVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWMAudioWriter_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IWMAudioWriter_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IWMAudioWriter_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IWMAudioWriter_SetAttribute(This,pszName,Type,pValue,cbLength) \ + (This)->lpVtbl -> SetAttribute(This,pszName,Type,pValue,cbLength) + +#define IWMAudioWriter_SetInputFormat(This,pWfx) \ + (This)->lpVtbl -> SetInputFormat(This,pWfx) + +#define IWMAudioWriter_SetOutputFormat(This,dwBitrate,dwSampleRate,dwNumChannels,dwAudioOptions) \ + (This)->lpVtbl -> SetOutputFormat(This,dwBitrate,dwSampleRate,dwNumChannels,dwAudioOptions) + +#define IWMAudioWriter_GetOutputFormat(This,pdwBitrate,pdwSampleRate,pdwNumChannels,pdwAudioOptions) \ + (This)->lpVtbl -> GetOutputFormat(This,pdwBitrate,pdwSampleRate,pdwNumChannels,pdwAudioOptions) + +#define IWMAudioWriter_WriteSample(This,pData,cbData) \ + (This)->lpVtbl -> WriteSample(This,pData,cbData) + +#define IWMAudioWriter_Flush(This) \ + (This)->lpVtbl -> Flush(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_SetAttribute_Proxy( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength); + + +void __RPC_STUB IWMAudioWriter_SetAttribute_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_SetInputFormat_Proxy( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ const WAVEFORMATEX __RPC_FAR *pWfx); + + +void __RPC_STUB IWMAudioWriter_SetInputFormat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_SetOutputFormat_Proxy( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ DWORD dwBitrate, + /* [in] */ DWORD dwSampleRate, + /* [in] */ DWORD dwNumChannels, + /* [in] */ DWORD dwAudioOptions); + + +void __RPC_STUB IWMAudioWriter_SetOutputFormat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_GetOutputFormat_Proxy( + IWMAudioWriter __RPC_FAR * This, + /* [out] */ DWORD __RPC_FAR *pdwBitrate, + /* [out] */ DWORD __RPC_FAR *pdwSampleRate, + /* [out] */ DWORD __RPC_FAR *pdwNumChannels, + /* [out] */ DWORD __RPC_FAR *pdwAudioOptions); + + +void __RPC_STUB IWMAudioWriter_GetOutputFormat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_WriteSample_Proxy( + IWMAudioWriter __RPC_FAR * This, + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData); + + +void __RPC_STUB IWMAudioWriter_WriteSample_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioWriter_Flush_Proxy( + IWMAudioWriter __RPC_FAR * This); + + +void __RPC_STUB IWMAudioWriter_Flush_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IWMAudioWriter_INTERFACE_DEFINED__ */ + + +#ifndef __IWMAudioReader_INTERFACE_DEFINED__ +#define __IWMAudioReader_INTERFACE_DEFINED__ + +/**************************************** + * Generated header for interface: IWMAudioReader + * at Mon Aug 09 13:10:31 1999 + * using MIDL 3.01.75 + ****************************************/ +/* [local][unique][helpstring][uuid][object] */ + + + +EXTERN_C const IID IID_IWMAudioReader; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + interface DECLSPEC_UUID("1A5636F2-DB5E-11d2-9D41-0060083178AF") + IWMAudioReader : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetAttributeByName( + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAttributeCount( + /* [out] */ WORD __RPC_FAR *pcAttributes) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAttributeByIndex( + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetOutputFormat( + /* [out] */ WAVEFORMATEX __RPC_FAR *pWfx, + /* [in] */ DWORD cbSize) = 0; + + virtual HRESULT STDMETHODCALLTYPE Start( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Seek( + DWORD dwMsTime) = 0; + + }; + +#else /* C style interface */ + + typedef struct IWMAudioReaderVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IWMAudioReader __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IWMAudioReader __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IWMAudioReader __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeByName )( + IWMAudioReader __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeCount )( + IWMAudioReader __RPC_FAR * This, + /* [out] */ WORD __RPC_FAR *pcAttributes); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeByIndex )( + IWMAudioReader __RPC_FAR * This, + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetOutputFormat )( + IWMAudioReader __RPC_FAR * This, + /* [out] */ WAVEFORMATEX __RPC_FAR *pWfx, + /* [in] */ DWORD cbSize); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( + IWMAudioReader __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Stop )( + IWMAudioReader __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Seek )( + IWMAudioReader __RPC_FAR * This, + DWORD dwMsTime); + + END_INTERFACE + } IWMAudioReaderVtbl; + + interface IWMAudioReader + { + CONST_VTBL struct IWMAudioReaderVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWMAudioReader_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IWMAudioReader_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IWMAudioReader_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IWMAudioReader_GetAttributeByName(This,pszName,pType,pValue,pcbLength) \ + (This)->lpVtbl -> GetAttributeByName(This,pszName,pType,pValue,pcbLength) + +#define IWMAudioReader_GetAttributeCount(This,pcAttributes) \ + (This)->lpVtbl -> GetAttributeCount(This,pcAttributes) + +#define IWMAudioReader_GetAttributeByIndex(This,wIndex,pwszName,pcbNameLen,pType,pValue,pcbLength) \ + (This)->lpVtbl -> GetAttributeByIndex(This,wIndex,pwszName,pcbNameLen,pType,pValue,pcbLength) + +#define IWMAudioReader_GetOutputFormat(This,pWfx,cbSize) \ + (This)->lpVtbl -> GetOutputFormat(This,pWfx,cbSize) + +#define IWMAudioReader_Start(This) \ + (This)->lpVtbl -> Start(This) + +#define IWMAudioReader_Stop(This) \ + (This)->lpVtbl -> Stop(This) + +#define IWMAudioReader_Seek(This,dwMsTime) \ + (This)->lpVtbl -> Seek(This,dwMsTime) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_GetAttributeByName_Proxy( + IWMAudioReader __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + +void __RPC_STUB IWMAudioReader_GetAttributeByName_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_GetAttributeCount_Proxy( + IWMAudioReader __RPC_FAR * This, + /* [out] */ WORD __RPC_FAR *pcAttributes); + + +void __RPC_STUB IWMAudioReader_GetAttributeCount_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_GetAttributeByIndex_Proxy( + IWMAudioReader __RPC_FAR * This, + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + +void __RPC_STUB IWMAudioReader_GetAttributeByIndex_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_GetOutputFormat_Proxy( + IWMAudioReader __RPC_FAR * This, + /* [out] */ WAVEFORMATEX __RPC_FAR *pWfx, + /* [in] */ DWORD cbSize); + + +void __RPC_STUB IWMAudioReader_GetOutputFormat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_Start_Proxy( + IWMAudioReader __RPC_FAR * This); + + +void __RPC_STUB IWMAudioReader_Start_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_Stop_Proxy( + IWMAudioReader __RPC_FAR * This); + + +void __RPC_STUB IWMAudioReader_Stop_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReader_Seek_Proxy( + IWMAudioReader __RPC_FAR * This, + DWORD dwMsTime); + + +void __RPC_STUB IWMAudioReader_Seek_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IWMAudioReader_INTERFACE_DEFINED__ */ + + +#ifndef __IWMAudioReadCallback_INTERFACE_DEFINED__ +#define __IWMAudioReadCallback_INTERFACE_DEFINED__ + +/**************************************** + * Generated header for interface: IWMAudioReadCallback + * at Mon Aug 09 13:10:31 1999 + * using MIDL 3.01.75 + ****************************************/ +/* [local][unique][helpstring][uuid][object] */ + + + +EXTERN_C const IID IID_IWMAudioReadCallback; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + interface DECLSPEC_UUID("1A5636F3-DB5E-11d2-9D41-0060083178AF") + IWMAudioReadCallback : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE OnSample( + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData, + /* [in] */ DWORD dwMsTime) = 0; + + virtual HRESULT STDMETHODCALLTYPE OnStatus( + /* [in] */ WMT_STATUS Status, + /* [in] */ HRESULT hr, + /* [in] */ const VARIANT __RPC_FAR *pParam) = 0; + + }; + +#else /* C style interface */ + + typedef struct IWMAudioReadCallbackVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IWMAudioReadCallback __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IWMAudioReadCallback __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IWMAudioReadCallback __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSample )( + IWMAudioReadCallback __RPC_FAR * This, + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData, + /* [in] */ DWORD dwMsTime); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnStatus )( + IWMAudioReadCallback __RPC_FAR * This, + /* [in] */ WMT_STATUS Status, + /* [in] */ HRESULT hr, + /* [in] */ const VARIANT __RPC_FAR *pParam); + + END_INTERFACE + } IWMAudioReadCallbackVtbl; + + interface IWMAudioReadCallback + { + CONST_VTBL struct IWMAudioReadCallbackVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWMAudioReadCallback_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IWMAudioReadCallback_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IWMAudioReadCallback_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IWMAudioReadCallback_OnSample(This,pData,cbData,dwMsTime) \ + (This)->lpVtbl -> OnSample(This,pData,cbData,dwMsTime) + +#define IWMAudioReadCallback_OnStatus(This,Status,hr,pParam) \ + (This)->lpVtbl -> OnStatus(This,Status,hr,pParam) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +HRESULT STDMETHODCALLTYPE IWMAudioReadCallback_OnSample_Proxy( + IWMAudioReadCallback __RPC_FAR * This, + /* [in] */ const BYTE __RPC_FAR *pData, + /* [in] */ DWORD cbData, + /* [in] */ DWORD dwMsTime); + + +void __RPC_STUB IWMAudioReadCallback_OnSample_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioReadCallback_OnStatus_Proxy( + IWMAudioReadCallback __RPC_FAR * This, + /* [in] */ WMT_STATUS Status, + /* [in] */ HRESULT hr, + /* [in] */ const VARIANT __RPC_FAR *pParam); + + +void __RPC_STUB IWMAudioReadCallback_OnStatus_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IWMAudioReadCallback_INTERFACE_DEFINED__ */ + + +#ifndef __IWMAudioInfo_INTERFACE_DEFINED__ +#define __IWMAudioInfo_INTERFACE_DEFINED__ + +/**************************************** + * Generated header for interface: IWMAudioInfo + * at Mon Aug 09 13:10:31 1999 + * using MIDL 3.01.75 + ****************************************/ +/* [local][unique][helpstring][uuid][object] */ + + + +EXTERN_C const IID IID_IWMAudioInfo; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + interface DECLSPEC_UUID("0AA139F0-F6A8-11d2-97F7-00A0C95EA850") + IWMAudioInfo : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetAttributeCount( + /* [out] */ WORD __RPC_FAR *pcAttributes) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAttributeByIndex( + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAttributeByName( + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAttribute( + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength) = 0; + + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IWMAudioInfoVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IWMAudioInfo __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IWMAudioInfo __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeCount )( + IWMAudioInfo __RPC_FAR * This, + /* [out] */ WORD __RPC_FAR *pcAttributes); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeByIndex )( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeByName )( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetAttribute )( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Close )( + IWMAudioInfo __RPC_FAR * This); + + END_INTERFACE + } IWMAudioInfoVtbl; + + interface IWMAudioInfo + { + CONST_VTBL struct IWMAudioInfoVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWMAudioInfo_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IWMAudioInfo_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IWMAudioInfo_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IWMAudioInfo_GetAttributeCount(This,pcAttributes) \ + (This)->lpVtbl -> GetAttributeCount(This,pcAttributes) + +#define IWMAudioInfo_GetAttributeByIndex(This,wIndex,pwszName,pcbNameLen,pType,pValue,pcbLength) \ + (This)->lpVtbl -> GetAttributeByIndex(This,wIndex,pwszName,pcbNameLen,pType,pValue,pcbLength) + +#define IWMAudioInfo_GetAttributeByName(This,pszName,pType,pValue,pcbLength) \ + (This)->lpVtbl -> GetAttributeByName(This,pszName,pType,pValue,pcbLength) + +#define IWMAudioInfo_SetAttribute(This,pszName,Type,pValue,cbLength) \ + (This)->lpVtbl -> SetAttribute(This,pszName,Type,pValue,cbLength) + +#define IWMAudioInfo_Close(This) \ + (This)->lpVtbl -> Close(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +HRESULT STDMETHODCALLTYPE IWMAudioInfo_GetAttributeCount_Proxy( + IWMAudioInfo __RPC_FAR * This, + /* [out] */ WORD __RPC_FAR *pcAttributes); + + +void __RPC_STUB IWMAudioInfo_GetAttributeCount_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioInfo_GetAttributeByIndex_Proxy( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ WORD wIndex, + /* [out] */ WCHAR __RPC_FAR *pwszName, + /* [out][in] */ WORD __RPC_FAR *pcbNameLen, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + +void __RPC_STUB IWMAudioInfo_GetAttributeByIndex_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioInfo_GetAttributeByName_Proxy( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [out] */ WMT_ATTR_DATATYPE __RPC_FAR *pType, + /* [out] */ BYTE __RPC_FAR *pValue, + /* [out][in] */ WORD __RPC_FAR *pcbLength); + + +void __RPC_STUB IWMAudioInfo_GetAttributeByName_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioInfo_SetAttribute_Proxy( + IWMAudioInfo __RPC_FAR * This, + /* [in] */ LPCWSTR pszName, + /* [in] */ WMT_ATTR_DATATYPE Type, + /* [in] */ const BYTE __RPC_FAR *pValue, + /* [in] */ WORD cbLength); + + +void __RPC_STUB IWMAudioInfo_SetAttribute_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +HRESULT STDMETHODCALLTYPE IWMAudioInfo_Close_Proxy( + IWMAudioInfo __RPC_FAR * This); + + +void __RPC_STUB IWMAudioInfo_Close_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IWMAudioInfo_INTERFACE_DEFINED__ */ + + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif |