GTK: Use C++ memory allocation.

This commit is contained in:
Brandon Wright 2019-05-14 15:34:25 -05:00
parent 124594d220
commit f8a0fadfa1
9 changed files with 64 additions and 76 deletions

View File

@ -56,6 +56,13 @@ class Resampler
return (a0 * b) + (a1 * m0) + (a2 * m1) + (a3 * c); return (a0 * b) + (a1 * m0) + (a2 * m1) + (a3 * c);
} }
Resampler()
{
this->buffer_size = 0;
buffer = NULL;
r_step = 1.0;
}
Resampler(int num_samples) Resampler(int num_samples)
{ {
this->buffer_size = num_samples; this->buffer_size = num_samples;
@ -77,6 +84,9 @@ class Resampler
inline void clear(void) inline void clear(void)
{ {
if (!buffer)
return;
start = 0; start = 0;
size = 0; size = 0;
memset(buffer, 0, buffer_size * 2); memset(buffer, 0, buffer_size * 2);

View File

@ -569,9 +569,9 @@ JoyDevice::JoyDevice (unsigned int device_num)
num_axes = SDL_JoystickNumAxes (filedes); num_axes = SDL_JoystickNumAxes (filedes);
num_hats = SDL_JoystickNumHats (filedes); num_hats = SDL_JoystickNumHats (filedes);
axis = (int *) malloc (sizeof (int) * num_axes); axis = new int[num_axes];
hat = (int *) malloc (sizeof (int) * num_hats); hat = new int[num_hats];
calibration = (Calibration *) malloc (sizeof (Calibration) * num_axes); calibration = new Calibration[num_axes];
for (int i = 0; i < num_axes; i++) for (int i = 0; i < num_axes; i++)
{ {
@ -595,9 +595,9 @@ JoyDevice::~JoyDevice ()
if (enabled) if (enabled)
{ {
SDL_JoystickClose (filedes); SDL_JoystickClose (filedes);
free (axis); delete[] axis;
free (hat); delete[] hat;
free (calibration); delete[] calibration;
} }
enabled = false; enabled = false;

View File

@ -1533,10 +1533,10 @@ void S9xDeinitDisplay ()
void S9xReinitDisplay () void S9xReinitDisplay ()
{ {
uint16 *buffer = NULL; uint8_t *buffer = NULL;
int width, height; int width, height;
buffer = (uint16 *) malloc (S9xDisplayDriver::image_size); buffer = new uint8_t[S9xDisplayDriver::image_size];
memmove (buffer, memmove (buffer,
driver->get_current_buffer (), driver->get_current_buffer (),
S9xDisplayDriver::image_size); S9xDisplayDriver::image_size);
@ -1551,9 +1551,9 @@ void S9xReinitDisplay ()
top_level->last_width = width; top_level->last_width = width;
top_level->last_height = height; top_level->last_height = height;
driver->push_buffer (buffer); driver->push_buffer ((uint16_t *)buffer);
free (buffer); delete[] buffer;
} }
bool8 S9xContinueUpdate (int width, int height) bool8 S9xContinueUpdate (int width, int height)

View File

@ -49,8 +49,8 @@ class S9xDisplayDriver
Snes9xWindow *window; Snes9xWindow *window;
Snes9xConfig *config; Snes9xConfig *config;
GtkWidget *drawing_area; GtkWidget *drawing_area;
void *padded_buffer[4]; uint8_t *padded_buffer[4];
void *buffer[4]; uint8_t *buffer[4];
}; };
#endif /* __GTK_DISPLAY_DRIVER_H*/ #endif /* __GTK_DISPLAY_DRIVER_H*/

View File

@ -116,11 +116,11 @@ S9xGTKDisplayDriver::output (void *src,
int int
S9xGTKDisplayDriver::init () S9xGTKDisplayDriver::init ()
{ {
buffer[0] = malloc (image_padded_size); buffer[0] = new uint8_t[image_padded_size];
buffer[1] = malloc (scaled_padded_size); buffer[1] = new uint8_t[scaled_padded_size];
padded_buffer[0] = (void *) (((uint8 *) buffer[0]) + image_padded_offset); padded_buffer[0] = &buffer[0][image_padded_offset];
padded_buffer[1] = (void *) (((uint8 *) buffer[1]) + scaled_padded_offset); padded_buffer[1] = &buffer[1][scaled_padded_offset];
memset (buffer[0], 0, image_padded_size); memset (buffer[0], 0, image_padded_size);
memset (buffer[1], 0, scaled_padded_size); memset (buffer[1], 0, scaled_padded_size);
@ -137,8 +137,8 @@ S9xGTKDisplayDriver::deinit ()
padded_buffer[0] = NULL; padded_buffer[0] = NULL;
padded_buffer[1] = NULL; padded_buffer[1] = NULL;
free (buffer[0]); delete[] buffer[0];
free (buffer[1]); delete[] buffer[1];
} }
void void

View File

@ -618,13 +618,13 @@ int S9xOpenGLDisplayDriver::init ()
return -1; return -1;
} }
buffer[0] = malloc (image_padded_size); buffer[0] = new uint8_t[image_padded_size];
buffer[1] = malloc (scaled_padded_size); buffer[1] = new uint8_t[scaled_padded_size];
clear_buffers (); clear_buffers ();
padded_buffer[0] = (void *) (((uint8 *) buffer[0]) + image_padded_offset); padded_buffer[0] = &buffer[0][image_padded_offset];
padded_buffer[1] = (void *) (((uint8 *) buffer[1]) + scaled_padded_offset); padded_buffer[1] = &buffer[1][scaled_padded_offset];
GFX.Screen = (uint16 *) padded_buffer[0]; GFX.Screen = (uint16 *) padded_buffer[0];
GFX.Pitch = image_width * image_bpp; GFX.Pitch = image_width * image_bpp;
@ -680,8 +680,8 @@ void S9xOpenGLDisplayDriver::deinit ()
padded_buffer[0] = NULL; padded_buffer[0] = NULL;
padded_buffer[1] = NULL; padded_buffer[1] = NULL;
free (buffer[0]); delete[] buffer[0];
free (buffer[1]); delete[] buffer[1];
if (using_pbos) if (using_pbos)
{ {

View File

@ -448,11 +448,11 @@ S9xXVDisplayDriver::init ()
desired_width = scaled_max_width; desired_width = scaled_max_width;
desired_height = scaled_max_width; desired_height = scaled_max_width;
buffer[0] = malloc (image_padded_size); buffer[0] = new uint8_t[image_padded_size];
buffer[1] = malloc (scaled_padded_size); buffer[1] = new uint8_t[scaled_padded_size];
padded_buffer[0] = (void *) (((uint8 *) buffer[0]) + image_padded_offset); padded_buffer[0] = &buffer[0][image_padded_offset];
padded_buffer[1] = (void *) (((uint8 *) buffer[1]) + scaled_padded_offset); padded_buffer[1] = &buffer[1][scaled_padded_offset];
memset (buffer[0], 0, image_padded_size); memset (buffer[0], 0, image_padded_size);
memset (buffer[1], 0, scaled_padded_size); memset (buffer[1], 0, scaled_padded_size);
@ -477,8 +477,8 @@ S9xXVDisplayDriver::deinit ()
XFreeColormap (display, xcolormap); XFreeColormap (display, xcolormap);
XFree (vi); XFree (vi);
free (buffer[0]); delete[] buffer[0];
free (buffer[1]); delete[] buffer[1];
shmctl (shm.shmid, IPC_RMID, 0); shmctl (shm.shmid, IPC_RMID, 0);
shmdt (shm.shmaddr); shmdt (shm.shmaddr);
@ -559,7 +559,7 @@ S9xXVDisplayDriver::get_current_buffer ()
void void
S9xXVDisplayDriver::push_buffer (uint16 *src) S9xXVDisplayDriver::push_buffer (uint16 *src)
{ {
memmove (GFX.Screen, src, image_size); memmove (GFX.Screen, src, image_size * image_bpp);
} }
void void

View File

@ -25,35 +25,33 @@ void S9xSDLSoundDriver::samples_available()
if (Settings.SoundSync && !Settings.TurboMode && !Settings.Mute) if (Settings.SoundSync && !Settings.TurboMode && !Settings.Mute)
{ {
mutex.lock(); mutex.lock();
int samples = buffer->space_empty(); int samples = buffer.space_empty();
mutex.unlock(); mutex.unlock();
while (samples < snes_samples_available) while (samples < snes_samples_available)
{ {
usleep(100); usleep(100);
mutex.lock(); mutex.lock();
samples = buffer->space_empty(); samples = buffer.space_empty();
mutex.unlock(); mutex.unlock();
} }
} }
mutex.lock(); mutex.lock();
buffer->push(temp, snes_samples_available); buffer.push(temp, snes_samples_available);
mutex.unlock(); mutex.unlock();
} }
void S9xSDLSoundDriver::mix(unsigned char *output, int bytes) void S9xSDLSoundDriver::mix(unsigned char *output, int bytes)
{ {
mutex.lock(); mutex.lock();
if (buffer->avail() >= bytes >> 1) if (buffer.avail() >= bytes >> 1)
buffer->read((int16_t *)output, bytes >> 1); buffer.read((int16_t *)output, bytes >> 1);
mutex.unlock(); mutex.unlock();
} }
S9xSDLSoundDriver::S9xSDLSoundDriver() S9xSDLSoundDriver::S9xSDLSoundDriver()
{ {
buffer = NULL;
audiospec = NULL;
} }
void S9xSDLSoundDriver::init() void S9xSDLSoundDriver::init()
@ -65,68 +63,48 @@ void S9xSDLSoundDriver::init()
void S9xSDLSoundDriver::terminate() void S9xSDLSoundDriver::terminate()
{ {
stop(); stop();
if (audiospec)
{
SDL_CloseAudio(); SDL_CloseAudio();
if (buffer)
delete buffer;
free(audiospec);
audiospec = NULL;
}
SDL_QuitSubSystem(SDL_INIT_AUDIO); SDL_QuitSubSystem(SDL_INIT_AUDIO);
} }
void S9xSDLSoundDriver::start() void S9xSDLSoundDriver::start()
{ {
if (!gui_config->mute_sound) if (!gui_config->mute_sound)
{
if (audiospec)
{ {
SDL_PauseAudio(0); SDL_PauseAudio(0);
} }
} }
}
void S9xSDLSoundDriver::stop() void S9xSDLSoundDriver::stop()
{
if (audiospec)
{ {
SDL_PauseAudio(1); SDL_PauseAudio(1);
} }
}
bool S9xSDLSoundDriver::open_device() bool S9xSDLSoundDriver::open_device()
{ {
audiospec = (SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec)); audiospec = {};
audiospec.freq = Settings.SoundPlaybackRate;
audiospec->freq = Settings.SoundPlaybackRate; audiospec.channels = 2;
audiospec->channels = 2; audiospec.format = AUDIO_S16SYS;
audiospec->format = AUDIO_S16SYS; audiospec.samples = (gui_config->sound_buffer_size * audiospec.freq / 1000) >> 2;
audiospec->samples = (gui_config->sound_buffer_size * audiospec->freq / 1000) >> 2; audiospec.callback = sdl_audio_callback;
audiospec->callback = sdl_audio_callback; audiospec.userdata = this;
audiospec->userdata = this;
printf("SDL sound driver initializing...\n"); printf("SDL sound driver initializing...\n");
printf(" --> (Frequency: %dhz, Latency: %dms)...", printf(" --> (Frequency: %dhz, Latency: %dms)...",
audiospec->freq, audiospec.freq,
(audiospec->samples * 1000 / audiospec->freq)); (audiospec.samples * 1000 / audiospec.freq));
if (SDL_OpenAudio(audiospec, NULL) < 0) if (SDL_OpenAudio(&audiospec, NULL) < 0)
{ {
printf("Failed\n"); printf("Failed\n");
free(audiospec);
audiospec = NULL;
return false; return false;
} }
printf("OK\n"); printf("OK\n");
buffer = new Resampler(gui_config->sound_buffer_size * audiospec->freq / 500); buffer.resize(gui_config->sound_buffer_size * audiospec.freq / 500);
buffer->time_ratio(1.0); buffer.time_ratio(1.0);
S9xSetSamplesAvailableCallback(c_samples_available, this); S9xSetSamplesAvailableCallback(c_samples_available, this);

View File

@ -29,8 +29,8 @@ class S9xSDLSoundDriver : public S9xSoundDriver
void samples_available(); void samples_available();
private: private:
SDL_AudioSpec *audiospec; SDL_AudioSpec audiospec;
Resampler *buffer; Resampler buffer;
std::mutex mutex; std::mutex mutex;
int16_t temp[512]; int16_t temp[512];
}; };