aboutsummaryrefslogtreecommitdiff
path: root/win32/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32/main.c')
-rw-r--r--win32/main.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/win32/main.c b/win32/main.c
index c1df7a7..3519d1b 100644
--- a/win32/main.c
+++ b/win32/main.c
@@ -23,6 +23,7 @@
#include "common/fmplayer_common.h"
#include "wavesave.h"
#include "fft/fft.h"
+#include "configdialog.h"
enum {
ID_OPENFILE = 0x10,
@@ -32,6 +33,7 @@ enum {
ID_OSCILLOVIEW,
ID_ABOUT,
ID_WAVESAVE,
+ ID_CONFIG,
};
#define FMPLAYER_CLASSNAME L"myon_fmplayer_ym2608_win32"
@@ -66,8 +68,8 @@ static struct {
bool paused;
HWND mainwnd;
WNDPROC btn_defproc;
- HWND button_2x, button_toneview, button_oscilloview, button_about;
- bool toneview_on, oscilloview_on, about_on;
+ HWND button_2x, button_toneview, button_oscilloview, button_about, button_config;
+ bool toneview_on, oscilloview_on, about_on, config_on;
const wchar_t *lastopenpath;
bool fmdsp_2x;
struct oscillodata oscillodata_audiothread[LIBOPNA_OSCILLO_TRACK_COUNT];
@@ -78,8 +80,10 @@ static struct {
atomic_flag at_fftdata_flag;
struct fmplayer_fft_data at_fftdata;
struct fmplayer_fft_input_data fftdata;
+ atomic_flag opna_flag;
} g = {
.at_fftdata_flag = ATOMIC_FLAG_INIT,
+ .opna_flag = ATOMIC_FLAG_INIT,
};
HWND g_currentdlg;
@@ -87,7 +91,9 @@ HWND g_currentdlg;
static void sound_cb(void *p, int16_t *buf, unsigned frames) {
struct opna_timer *timer = (struct opna_timer *)p;
ZeroMemory(buf, sizeof(int16_t)*frames*2);
+ while (atomic_flag_test_and_set_explicit(&g.opna_flag, memory_order_acquire));
opna_timer_mix_oscillo(timer, buf, frames, g.oscillodata_audiothread);
+ atomic_flag_clear_explicit(&g.opna_flag, memory_order_release);
if (!atomic_flag_test_and_set_explicit(
&toneview_g.flag, memory_order_acquire)) {
tonedata_from_opna(&toneview_g.tonedata, &g.opna);
@@ -170,6 +176,11 @@ static void openfile(HWND hwnd, const wchar_t *path) {
about_set_adpcmrom_loaded(true);
}
opna_set_mask(&g.opna, mask);
+ opna_ssg_set_mix(&g.opna.ssg, fmplayer_config.ssg_mix);
+ opna_ssg_set_ymf288(&g.opna.ssg, &g.opna.resampler, fmplayer_config.ssg_ymf288);
+ ppz8_set_interpolation(&g.ppz8, fmplayer_config.ppz8_interp);
+ opna_fm_set_hires_sin(&g.opna.fm, fmplayer_config.fm_hires_sin);
+ opna_fm_set_hires_env(&g.opna.fm, fmplayer_config.fm_hires_env);
WideCharToMultiByte(932, WC_NO_BEST_FIT_CHARS, path, -1, g.work.filename, sizeof(g.work.filename), 0, 0);
fmplayer_file_load(&g.work, g.fmfile, 1);
if (!g.sound) {
@@ -504,6 +515,15 @@ static bool on_create(HWND hwnd, CREATESTRUCT *cs) {
50, 25,
hwnd, (HMENU)ID_ABOUT, g.hinst, 0
);
+ g.button_config = CreateWindowEx(
+ 0,
+ L"BUTTON",
+ L"&Config...",
+ WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_CHECKBOX | BS_PUSHLIKE,
+ 460, 10,
+ 100, 25,
+ hwnd, (HMENU)ID_CONFIG, g.hinst, 0
+ );
g.btn_defproc = (WNDPROC)GetWindowLongPtr(button, GWLP_WNDPROC);
SetWindowLongPtr(button, GWLP_WNDPROC, (intptr_t)btn_wndproc);
SetWindowLongPtr(pbutton, GWLP_WNDPROC, (intptr_t)btn_wndproc);
@@ -512,6 +532,7 @@ static bool on_create(HWND hwnd, CREATESTRUCT *cs) {
SetWindowLongPtr(g.button_toneview, GWLP_WNDPROC, (intptr_t)btn_wndproc);
SetWindowLongPtr(g.button_oscilloview, GWLP_WNDPROC, (intptr_t)btn_wndproc);
SetWindowLongPtr(g.button_about, GWLP_WNDPROC, (intptr_t)btn_wndproc);
+ SetWindowLongPtr(g.button_config, GWLP_WNDPROC, (intptr_t)btn_wndproc);
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
@@ -523,6 +544,7 @@ static bool on_create(HWND hwnd, CREATESTRUCT *cs) {
SetWindowFont(g.button_toneview, font, TRUE);
SetWindowFont(g.button_oscilloview, font, TRUE);
SetWindowFont(g.button_about, font, TRUE);
+ SetWindowFont(g.button_config, font, TRUE);
loadfont();
fmdsp_init(&g.fmdsp, g.font_loaded ? &g.font : 0);
fmdsp_vram_init(&g.fmdsp, &g.work, g.vram);
@@ -552,6 +574,23 @@ static void about_close_cb(void *ptr) {
Button_SetCheck(g.button_about, false);
}
+static void configdialog_close_cb(void *ptr) {
+ (void)ptr;
+ g.config_on = false;
+ Button_SetCheck(g.button_config, false);
+}
+
+static void configdialog_change_cb(void *ptr) {
+ (void)ptr;
+ while (atomic_flag_test_and_set_explicit(&g.opna_flag, memory_order_acquire));
+ opna_ssg_set_mix(&g.opna.ssg, fmplayer_config.ssg_mix);
+ opna_ssg_set_ymf288(&g.opna.ssg, &g.opna.resampler, fmplayer_config.ssg_ymf288);
+ ppz8_set_interpolation(&g.ppz8, fmplayer_config.ppz8_interp);
+ opna_fm_set_hires_sin(&g.opna.fm, fmplayer_config.fm_hires_sin);
+ opna_fm_set_hires_env(&g.opna.fm, fmplayer_config.fm_hires_env);
+ atomic_flag_clear_explicit(&g.opna_flag, memory_order_release);
+}
+
static void on_command(HWND hwnd, int id, HWND hwnd_c, UINT code) {
(void)code;
(void)hwnd_c;
@@ -613,6 +652,17 @@ static void on_command(HWND hwnd, int id, HWND hwnd_c, UINT code) {
}
}
break;
+ case ID_CONFIG:
+ if (!g.config_on) {
+ g.config_on = true;
+ configdialog_open(g.hinst, hwnd, configdialog_close_cb, 0, configdialog_change_cb, 0);
+ Button_SetCheck(g.button_config, true);
+ } else {
+ g.config_on = false;
+ configdialog_close();
+ Button_SetCheck(g.button_config, false);
+ }
+ break;
}
}