aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Encoder/enc_wav
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Encoder/enc_wav')
-rw-r--r--Src/Plugins/Encoder/enc_wav/ACMEncoder.cpp265
-rw-r--r--Src/Plugins/Encoder/enc_wav/ACMEncoder.h47
-rw-r--r--Src/Plugins/Encoder/enc_wav/Config.cpp110
-rw-r--r--Src/Plugins/Encoder/enc_wav/Config.h31
-rw-r--r--Src/Plugins/Encoder/enc_wav/Finisher.h10
-rw-r--r--Src/Plugins/Encoder/enc_wav/WAVEncoder.cpp72
-rw-r--r--Src/Plugins/Encoder/enc_wav/WAVEncoder.h25
-rw-r--r--Src/Plugins/Encoder/enc_wav/enc_wav.rc111
-rw-r--r--Src/Plugins/Encoder/enc_wav/enc_wav.sln30
-rw-r--r--Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj252
-rw-r--r--Src/Plugins/Encoder/enc_wav/enc_wav.vcxproj.filters50
-rw-r--r--Src/Plugins/Encoder/enc_wav/main.cpp176
-rw-r--r--Src/Plugins/Encoder/enc_wav/preferences.cpp1
-rw-r--r--Src/Plugins/Encoder/enc_wav/resource.h23
-rw-r--r--Src/Plugins/Encoder/enc_wav/version.rc239
15 files changed, 1242 insertions, 0 deletions
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