Add volume control to SDL

This commit is contained in:
Lior Halphon 2020-03-27 19:10:42 +03:00
parent 2f1b8e5b57
commit 9f3bffd4dd
3 changed files with 32 additions and 1 deletions

View File

@ -106,7 +106,8 @@ configuration_t configuration =
.scaling_mode = GB_SDL_SCALING_INTEGER_FACTOR, .scaling_mode = GB_SDL_SCALING_INTEGER_FACTOR,
.blending_mode = GB_FRAME_BLENDING_MODE_ACCURATE, .blending_mode = GB_FRAME_BLENDING_MODE_ACCURATE,
.rewind_length = 60 * 2, .rewind_length = 60 * 2,
.model = MODEL_CGB .model = MODEL_CGB,
.volume = 100,
}; };
@ -681,8 +682,32 @@ void cycle_highpass_filter_backwards(unsigned index)
} }
} }
const char *volume_string(unsigned index)
{
static char ret[5];
sprintf(ret, "%d%%", configuration.volume);
return ret;
}
void increase_volume(unsigned index)
{
configuration.volume += 5;
if (configuration.volume > 100) {
configuration.volume = 100;
}
}
void decrease_volume(unsigned index)
{
configuration.volume -= 5;
if (configuration.volume > 100) {
configuration.volume = 0;
}
}
static const struct menu_item audio_menu[] = { static const struct menu_item audio_menu[] = {
{"Highpass Filter:", cycle_highpass_filter, highpass_filter_string, cycle_highpass_filter_backwards}, {"Highpass Filter:", cycle_highpass_filter, highpass_filter_string, cycle_highpass_filter_backwards},
{"Volume:", increase_volume, volume_string, decrease_volume},
{"Back", return_to_root_menu}, {"Back", return_to_root_menu},
{NULL,} {NULL,}
}; };

View File

@ -104,6 +104,7 @@ typedef struct {
/* v0.13 */ /* v0.13 */
uint8_t dmg_palette; uint8_t dmg_palette;
GB_border_mode_t border_mode; GB_border_mode_t border_mode;
uint8_t volume;
} configuration_t; } configuration_t;
extern configuration_t configuration; extern configuration_t configuration;

View File

@ -420,6 +420,11 @@ static void gb_audio_callback(GB_gameboy_t *gb, GB_sample_t *sample)
return; return;
} }
if (configuration.volume != 100) {
sample->left = sample->left * configuration.volume / 100;
sample->right = sample->right * configuration.volume / 100;
}
SDL_QueueAudio(device_id, sample, sizeof(*sample)); SDL_QueueAudio(device_id, sample, sizeof(*sample));
} }