Add mute toggle.

This commit is contained in:
Themaister 2011-11-26 15:54:58 +01:00
parent 2476e3dee3
commit 5dbd1ea35c
7 changed files with 51 additions and 5 deletions

View File

@ -267,6 +267,7 @@ static const struct snes_keybind snes_keybinds_1[] = {
{ SSNES_CHEAT_TOGGLE, SK_u, NO_BTN, AXIS_NONE }, { SSNES_CHEAT_TOGGLE, SK_u, NO_BTN, AXIS_NONE },
{ SSNES_SCREENSHOT, SK_PRINT, NO_BTN, AXIS_NONE }, { SSNES_SCREENSHOT, SK_PRINT, NO_BTN, AXIS_NONE },
{ SSNES_DSP_CONFIG, SK_c, NO_BTN, AXIS_NONE }, { SSNES_DSP_CONFIG, SK_c, NO_BTN, AXIS_NONE },
{ SSNES_MUTE, SK_F9, NO_BTN, AXIS_NONE },
{ -1 } { -1 }
}; };

View File

@ -52,6 +52,7 @@ enum
SSNES_CHEAT_TOGGLE, SSNES_CHEAT_TOGGLE,
SSNES_SCREENSHOT, SSNES_SCREENSHOT,
SSNES_DSP_CONFIG, SSNES_DSP_CONFIG,
SSNES_MUTE,
SSNES_BIND_LIST_END SSNES_BIND_LIST_END
}; };

View File

@ -231,6 +231,7 @@ struct global
double src_ratio; double src_ratio;
bool use_float; bool use_float;
bool mute;
float *outsamples; float *outsamples;
int16_t *conv_outsamples; int16_t *conv_outsamples;

View File

@ -161,6 +161,7 @@ static void py_set_attrs(PyObject *mod)
DECL_ATTR_SSNES(CHEAT_TOGGLE); DECL_ATTR_SSNES(CHEAT_TOGGLE);
DECL_ATTR_SSNES(SCREENSHOT); DECL_ATTR_SSNES(SCREENSHOT);
DECL_ATTR_SSNES(DSP_CONFIG); DECL_ATTR_SSNES(DSP_CONFIG);
DECL_ATTR_SSNES(MUTE);
} }
static PyModuleDef SNESModule = { static PyModuleDef SNESModule = {

View File

@ -492,6 +492,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE) DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE)
DECLARE_BIND(screenshot, SSNES_SCREENSHOT) DECLARE_BIND(screenshot, SSNES_SCREENSHOT)
DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG) DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG)
DECLARE_BIND(audio_mute, SSNES_MUTE)
}, },
{ {
DECLARE_BIND(player2_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player2_a, SNES_DEVICE_ID_JOYPAD_A)
@ -528,6 +529,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE) DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE)
DECLARE_BIND(screenshot, SSNES_SCREENSHOT) DECLARE_BIND(screenshot, SSNES_SCREENSHOT)
DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG) DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG)
DECLARE_BIND(audio_mute, SSNES_MUTE)
}, },
{ {
DECLARE_BIND(player3_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player3_a, SNES_DEVICE_ID_JOYPAD_A)
@ -564,6 +566,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE) DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE)
DECLARE_BIND(screenshot, SSNES_SCREENSHOT) DECLARE_BIND(screenshot, SSNES_SCREENSHOT)
DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG) DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG)
DECLARE_BIND(audio_mute, SSNES_MUTE)
}, },
{ {
DECLARE_BIND(player4_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player4_a, SNES_DEVICE_ID_JOYPAD_A)
@ -600,6 +603,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE) DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE)
DECLARE_BIND(screenshot, SSNES_SCREENSHOT) DECLARE_BIND(screenshot, SSNES_SCREENSHOT)
DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG) DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG)
DECLARE_BIND(audio_mute, SSNES_MUTE)
}, },
{ {
DECLARE_BIND(player5_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player5_a, SNES_DEVICE_ID_JOYPAD_A)
@ -636,6 +640,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE) DECLARE_BIND(cheat_toggle, SSNES_CHEAT_TOGGLE)
DECLARE_BIND(screenshot, SSNES_SCREENSHOT) DECLARE_BIND(screenshot, SSNES_SCREENSHOT)
DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG) DECLARE_BIND(dsp_config, SSNES_DSP_CONFIG)
DECLARE_BIND(audio_mute, SSNES_MUTE)
}, },
}; };

40
ssnes.c
View File

@ -247,7 +247,7 @@ static void video_cached_frame(void)
#endif #endif
} }
static bool audio_flush(const int16_t *data, unsigned samples) static bool audio_flush(const int16_t *data, size_t samples)
{ {
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
if (g_extern.recording) if (g_extern.recording)
@ -302,20 +302,31 @@ static bool audio_flush(const int16_t *data, unsigned samples)
output_frames = dsp_output.frames; output_frames = dsp_output.frames;
} }
union
{
float f[0x10000];
int16_t i[0x10000 * sizeof(float) / sizeof(int16_t)];
} static const empty_buf;
if (g_extern.audio_data.use_float) if (g_extern.audio_data.use_float)
{ {
if (driver.audio->write(driver.audio_data, output_data, output_frames * sizeof(float) * 2) < 0) if (driver.audio->write(driver.audio_data,
g_extern.audio_data.mute ? empty_buf.f : output_data, output_frames * sizeof(float) * 2) < 0)
{ {
fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n"); fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n");
return false; return false;
} }
} }
else else
{
if (!g_extern.audio_data.mute)
{ {
audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples, audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples,
output_data, output_frames * 2); output_data, output_frames * 2);
}
if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, if (driver.audio->write(driver.audio_data,
g_extern.audio_data.mute ? empty_buf.i : g_extern.audio_data.conv_outsamples,
output_frames * sizeof(int16_t) * 2) < 0) output_frames * sizeof(int16_t) * 2) < 0)
{ {
fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n"); fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n");
@ -1824,9 +1835,32 @@ static void check_dsp_config(void)
} }
#endif #endif
static void check_mute(void)
{
if (!g_extern.audio_active)
return;
static bool old_pressed = false;
bool pressed = driver.input->key_pressed(driver.input_data, SSNES_MUTE);
if (pressed && !old_pressed)
{
g_extern.audio_data.mute = !g_extern.audio_data.mute;
const char *msg = g_extern.audio_data.mute ? "Audio muted!" : "Audio unmuted!";
msg_queue_clear(g_extern.msg_queue);
msg_queue_push(g_extern.msg_queue, msg, 1, 180);
SSNES_LOG("%s\n", msg);
}
old_pressed = pressed;
}
static void do_state_checks(void) static void do_state_checks(void)
{ {
check_screenshot(); check_screenshot();
check_mute();
if (!g_extern.netplay) if (!g_extern.netplay)
{ {
check_pause(); check_pause();

View File

@ -308,6 +308,9 @@
# input_cheat_index_minus = t # input_cheat_index_minus = t
# input_cheat_toggle = u # input_cheat_toggle = u
# Mute/unmute audio
# input_audio_mute = f9
# Take screenshot # Take screenshot
# input_screenshot = print_screen # input_screenshot = print_screen