diff --git a/audio/audio_defines.h b/audio/audio_defines.h index c9c1264f4d..74224d6cad 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -77,11 +77,11 @@ enum audio_mixer_state typedef struct audio_statistics { + unsigned samples; float average_buffer_saturation; float std_deviation_percentage; float close_to_underrun; float close_to_blocking; - unsigned samples; } audio_statistics_t; RETRO_END_DECLS diff --git a/audio/drivers_resampler/cc_resampler.c b/audio/drivers_resampler/cc_resampler.c index 2fc0abb2b5..bb8a80c857 100644 --- a/audio/drivers_resampler/cc_resampler.c +++ b/audio/drivers_resampler/cc_resampler.c @@ -49,10 +49,9 @@ typedef struct rarch_CC_resampler { - audio_frame_float_t buffer[4]; - - float distance; void (*process)(void *re, struct resampler_data *data); + audio_frame_float_t buffer[4]; + float distance; } rarch_CC_resampler_t; #ifdef _MIPS_ARCH_ALLEGREX diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index 4b24dd7c4f..982f681cf5 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -73,16 +73,16 @@ struct audio_mixer_sound struct { /* wav */ - unsigned frames; const float* pcm; + unsigned frames; } wav; #ifdef HAVE_STB_VORBIS struct { /* ogg */ - unsigned size; const void* data; + unsigned size; } ogg; #endif @@ -90,8 +90,8 @@ struct audio_mixer_sound struct { /* flac */ - unsigned size; const void* data; + unsigned size; } flac; #endif @@ -99,8 +99,8 @@ struct audio_mixer_sound struct { /* mp */ - unsigned size; const void* data; + unsigned size; } mp3; #endif @@ -108,8 +108,8 @@ struct audio_mixer_sound struct { /* mod/s3m/xm */ - unsigned size; const void* data; + unsigned size; } mod; #endif } types; @@ -117,12 +117,6 @@ struct audio_mixer_sound struct audio_mixer_voice { - bool repeat; - unsigned type; - float volume; - audio_mixer_sound_t *sound; - audio_mixer_stop_cb_t stop_cb; - union { struct @@ -133,61 +127,67 @@ struct audio_mixer_voice #ifdef HAVE_STB_VORBIS struct { - unsigned position; - unsigned samples; - unsigned buf_samples; - float* buffer; - float ratio; stb_vorbis *stream; void *resampler_data; const retro_resampler_t *resampler; + float *buffer; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; } ogg; #endif #ifdef HAVE_DR_FLAC struct { - unsigned position; - unsigned samples; - unsigned buf_samples; float* buffer; - float ratio; drflac *stream; void *resampler_data; const retro_resampler_t *resampler; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; } flac; #endif #ifdef HAVE_DR_MP3 struct { - unsigned position; - unsigned samples; - unsigned buf_samples; - float* buffer; - float ratio; drmp3 stream; void *resampler_data; const retro_resampler_t *resampler; + float* buffer; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; } mp3; #endif #ifdef HAVE_IBXM struct { - unsigned position; - unsigned samples; - unsigned buf_samples; int* buffer; struct replay* stream; struct module* module; + unsigned position; + unsigned samples; + unsigned buf_samples; } mod; #endif } types; + audio_mixer_sound_t *sound; + audio_mixer_stop_cb_t stop_cb; + unsigned type; + float volume; + bool repeat; + }; /* TODO/FIXME - static globals */ -static struct audio_mixer_voice s_voices[AUDIO_MIXER_MAX_VOICES] = {{0}}; +static struct audio_mixer_voice s_voices[AUDIO_MIXER_MAX_VOICES] = {0}; static unsigned s_rate = 0; #ifdef HAVE_RWAV diff --git a/libretro-common/audio/resampler/drivers/nearest_resampler.c b/libretro-common/audio/resampler/drivers/nearest_resampler.c index a0da50bc62..578f589f2e 100644 --- a/libretro-common/audio/resampler/drivers/nearest_resampler.c +++ b/libretro-common/audio/resampler/drivers/nearest_resampler.c @@ -68,15 +68,9 @@ static void *resampler_nearest_init(const struct resampler_config *config, { rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*) calloc(1, sizeof(rarch_nearest_resampler_t)); - - (void)config; - (void)mask; - if (!re) return NULL; - re->fraction = 0; - return re; } diff --git a/libretro-common/file/archive_file.c b/libretro-common/file/archive_file.c index 5f58ab8f13..a0e64add8a 100644 --- a/libretro-common/file/archive_file.c +++ b/libretro-common/file/archive_file.c @@ -667,7 +667,7 @@ const struct file_archive_file_backend* file_archive_get_file_backend(const char uint32_t file_archive_get_file_crc32(const char *path) { file_archive_transfer_t state; - struct archive_extract_userdata userdata = {{0}}; + struct archive_extract_userdata userdata = {0}; bool returnerr = false; const char *archive_path = NULL; bool contains_compressed = path_contains_compressed_file(path); diff --git a/libretro-common/file/archive_file_zlib.c b/libretro-common/file/archive_file_zlib.c index b339aebb4e..6f4efe1c85 100644 --- a/libretro-common/file/archive_file_zlib.c +++ b/libretro-common/file/archive_file_zlib.c @@ -330,7 +330,7 @@ static int64_t zip_file_read( { file_archive_transfer_t state = {ARCHIVE_TRANSFER_INIT}; decomp_state_t decomp = {0}; - struct archive_extract_userdata userdata = {{0}}; + struct archive_extract_userdata userdata = {0}; bool returnerr = true; int ret = 0; diff --git a/libretro-common/include/cdrom/cdrom.h b/libretro-common/include/cdrom/cdrom.h index 01c47988d7..063d9aca49 100644 --- a/libretro-common/include/cdrom/cdrom.h +++ b/libretro-common/include/cdrom/cdrom.h @@ -62,10 +62,10 @@ typedef struct typedef struct { - char drive; + cdrom_track_t track[99]; /* unsigned alignment */ + cdrom_group_timeouts_t timeouts; /* unsigned short alignment */ unsigned char num_tracks; - cdrom_group_timeouts_t timeouts; - cdrom_track_t track[99]; + char drive; } cdrom_toc_t; void cdrom_lba_to_msf(unsigned lba, unsigned char *min, unsigned char *sec, unsigned char *frame); diff --git a/libretro-common/include/file/archive_file.h b/libretro-common/include/file/archive_file.h index c5284f36a5..7d0987e10d 100644 --- a/libretro-common/include/file/archive_file.h +++ b/libretro-common/include/file/archive_file.h @@ -60,49 +60,48 @@ typedef struct file_archive_handle typedef struct file_archive_transfer { - enum file_archive_transfer_type type; - struct RFILE *archive_file; int64_t archive_size; void *context; - unsigned step_total, step_current; + struct RFILE *archive_file; const struct file_archive_file_backend *backend; #ifdef HAVE_MMAP - int archive_mmap_fd; uint8_t *archive_mmap_data; + int archive_mmap_fd; #endif + unsigned step_total; + unsigned step_current; + enum file_archive_transfer_type type; } file_archive_transfer_t; typedef struct { + file_archive_transfer_t archive; /* int64_t alignment */ char *source_file; char *subdir; char *target_dir; char *target_file; char *valid_ext; - char *callback_error; - - file_archive_transfer_t archive; struct archive_extract_userdata *userdata; } decompress_state_t; struct archive_extract_userdata { /* These are set or read by the archive processing */ - char archive_path[PATH_MAX_LENGTH]; - char current_file_path[PATH_MAX_LENGTH]; char *first_extracted_file_path; const char *extraction_directory; - size_t archive_path_size; struct string_list *ext; struct string_list *list; - bool found_file; - bool list_only; - uint32_t crc; file_archive_transfer_t *transfer; /* Not used by the processing, free to use outside or in iterate callback */ decompress_state_t *dec; void* cb_data; + size_t archive_path_size; + uint32_t crc; + char archive_path[PATH_MAX_LENGTH]; + char current_file_path[PATH_MAX_LENGTH]; + bool found_file; + bool list_only; }; /* Returns true when parsing should continue. False to stop. */ diff --git a/libretro-common/streams/chd_stream.c b/libretro-common/streams/chd_stream.c index 13e3e46615..6d934eac50 100644 --- a/libretro-common/streams/chd_stream.c +++ b/libretro-common/streams/chd_stream.c @@ -38,16 +38,8 @@ struct chdstream { chd_file *chd; - /* Should we swap bytes? */ - bool swab; - /* Size of frame taken from each hunk */ - uint32_t frame_size; - /* Offset of data within frame */ - uint32_t frame_offset; - /* Number of frames per hunk */ - uint32_t frames_per_hunk; - /* First frame of track in chd */ - uint32_t track_frame; + /* Loaded hunk */ + uint8_t *hunkmem; /* Byte offset where track data starts (after pregap) */ size_t track_start; /* Byte offset where track data ends */ @@ -56,16 +48,20 @@ struct chdstream size_t offset; /* Loaded hunk number */ int32_t hunknum; - /* Loaded hunk */ - uint8_t *hunkmem; + /* Size of frame taken from each hunk */ + uint32_t frame_size; + /* Offset of data within frame */ + uint32_t frame_offset; + /* Number of frames per hunk */ + uint32_t frames_per_hunk; + /* First frame of track in chd */ + uint32_t track_frame; + /* Should we swap bytes? */ + bool swab; }; typedef struct metadata { - char type[64]; - char subtype[32]; - char pgtype[32]; - char pgsub[32]; uint32_t frame_offset; uint32_t frames; uint32_t pad; @@ -73,6 +69,10 @@ typedef struct metadata uint32_t pregap; uint32_t postgap; uint32_t track; + char type[64]; + char subtype[32]; + char pgtype[32]; + char pgsub[32]; } metadata_t; static uint32_t padding_frames(uint32_t frames) diff --git a/libretro-common/streams/interface_stream.c b/libretro-common/streams/interface_stream.c index a0fa727310..3852801cb7 100644 --- a/libretro-common/streams/interface_stream.c +++ b/libretro-common/streams/interface_stream.c @@ -35,8 +35,6 @@ struct intfstream_internal { - enum intfstream_type type; - struct { RFILE *fp; @@ -44,19 +42,19 @@ struct intfstream_internal struct { + memstream_t *fp; struct { uint8_t *data; uint64_t size; } buf; - memstream_t *fp; bool writable; } memory; #ifdef HAVE_CHD struct { - int32_t track; chdstream_t *fp; + int32_t track; } chd; #endif #if defined(HAVE_ZLIB) @@ -65,6 +63,7 @@ struct intfstream_internal rzipstream_t *fp; } rzip; #endif + enum intfstream_type type; }; int64_t intfstream_get_size(intfstream_internal_t *intf) diff --git a/libretro-common/streams/memory_stream.c b/libretro-common/streams/memory_stream.c index 98e8b6e1ff..2aa1c8081b 100644 --- a/libretro-common/streams/memory_stream.c +++ b/libretro-common/streams/memory_stream.c @@ -33,10 +33,10 @@ static uint64_t last_file_size = 0; struct memstream { - uint8_t *buf; uint64_t size; uint64_t ptr; uint64_t max_ptr; + uint8_t *buf; unsigned writing; }; diff --git a/libretro-common/streams/rzip_stream.c b/libretro-common/streams/rzip_stream.c index df9d9d19db..996414343f 100644 --- a/libretro-common/streams/rzip_stream.c +++ b/libretro-common/streams/rzip_stream.c @@ -47,10 +47,7 @@ /* Holds all metadata for an RZIP file stream */ struct rzipstream { - bool is_compressed; - bool is_writing; uint64_t size; - uint32_t chunk_size; /* virtual_ptr: Used to track how much * uncompressed data has been read */ uint64_t virtual_ptr; @@ -60,12 +57,15 @@ struct rzipstream const struct trans_stream_backend *inflate_backend; void *inflate_stream; uint8_t *in_buf; + uint8_t *out_buf; uint32_t in_buf_size; uint32_t in_buf_ptr; - uint8_t *out_buf; uint32_t out_buf_size; uint32_t out_buf_ptr; uint32_t out_buf_occupancy; + uint32_t chunk_size; + bool is_compressed; + bool is_writing; }; /* Header Functions */ diff --git a/libretro-common/streams/trans_stream_zlib.c b/libretro-common/streams/trans_stream_zlib.c index e194cbdc8d..e5d1a4af78 100644 --- a/libretro-common/streams/trans_stream_zlib.c +++ b/libretro-common/streams/trans_stream_zlib.c @@ -29,9 +29,9 @@ struct zlib_trans_stream { - bool inited; - int ex; /* window_bits or level */ z_stream z; + int ex; /* window_bits or level */ + bool inited; }; static void *zlib_deflate_stream_new(void) diff --git a/retroarch.c b/retroarch.c index c4eb6ad0af..22cc8bcf7b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1939,7 +1939,7 @@ struct rarch_state menu_input_t menu_input_state; /* retro_time_t alignment */ #endif - retro_usec_t runloop_frame_time_last; + retro_usec_t runloop_frame_time_last; /* int64_t alignment */ #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) rarch_timer_t shader_delay_timer; /* int64_t alignment */ @@ -28996,7 +28996,7 @@ static bool audio_compute_buffer_statistics( (unsigned)p_rarch->audio_driver_free_samples_count, AUDIO_BUFFER_FREE_SAMPLES_COUNT); - if (!stats || samples < 3) + if (samples < 3) return false; stats->samples = (unsigned) @@ -29049,13 +29049,19 @@ static bool audio_compute_buffer_statistics( return true; } +#ifdef DEBUG static void report_audio_buffer_statistics(struct rarch_state *p_rarch) { - audio_statistics_t audio_stats = {0.0f}; + audio_statistics_t audio_stats; + audio_stats.samples = 0; + audio_stats.average_buffer_saturation = 0.0f; + audio_stats.std_deviation_percentage = 0.0f; + audio_stats.close_to_underrun = 0.0f; + audio_stats.close_to_blocking = 0.0f; + if (!audio_compute_buffer_statistics(p_rarch, &audio_stats)) return; -#ifdef DEBUG RARCH_LOG("[Audio]: Average audio buffer saturation: %.2f %%," " standard deviation (percentage points): %.2f %%.\n" "[Audio]: Amount of time spent close to underrun: %.2f %%." @@ -29064,8 +29070,8 @@ static void report_audio_buffer_statistics(struct rarch_state *p_rarch) audio_stats.std_deviation_percentage, audio_stats.close_to_underrun, audio_stats.close_to_blocking); -#endif } +#endif /** * config_get_audio_driver_options: @@ -29134,7 +29140,9 @@ static bool audio_driver_deinit_internal(struct rarch_state *p_rarch) #ifdef HAVE_DSP_FILTER audio_driver_dsp_filter_free(); #endif +#ifdef DEBUG report_audio_buffer_statistics(p_rarch); +#endif return true; } @@ -32980,7 +32988,7 @@ static void video_driver_frame(const void *data, unsigned width, if (video_info.statistics_show) { - audio_statistics_t audio_stats = {0.0f}; + audio_statistics_t audio_stats; double stddev = 0.0; struct retro_system_av_info *av_info = &p_rarch->video_driver_av_info; unsigned red = 255; @@ -32988,6 +32996,12 @@ static void video_driver_frame(const void *data, unsigned width, unsigned blue = 255; unsigned alpha = 255; + audio_stats.samples = 0; + audio_stats.average_buffer_saturation = 0.0f; + audio_stats.std_deviation_percentage = 0.0f; + audio_stats.close_to_underrun = 0.0f; + audio_stats.close_to_blocking = 0.0f; + video_monitor_fps_statistics(NULL, &stddev, NULL); video_info.osd_stat_params.x = 0.010f;