diff --git a/tasks/task_content.c b/tasks/task_content.c index 76e21455b5..31e471ffb7 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -201,7 +201,10 @@ static char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS]; #ifdef HAVE_CDROM static void task_cdrom_dump_handler(retro_task_t *task) { - task_cdrom_dump_state_t *state = (task_cdrom_dump_state_t*)task->state; + task_cdrom_dump_state_t *state = (task_cdrom_dump_state_t*)task->state; + settings_t *settings = config_get_ptr(); + const char *directory_core_assets = settings + ? settings->paths.directory_core_assets : NULL; if (task_get_progress(task) == 100) { @@ -226,186 +229,180 @@ static void task_cdrom_dump_handler(retro_task_t *task) switch (state->state) { case DUMP_STATE_TOC_PENDING: - { - /* open cuesheet file from drive */ - char cue_path[PATH_MAX_LENGTH] = {0}; - - cdrom_device_fillpath(cue_path, sizeof(cue_path), state->drive_letter[0], 0, true); - - state->file = filestream_open(cue_path, RETRO_VFS_FILE_ACCESS_READ, 0); - - if (!state->file) { - RARCH_ERR("[CDROM]: Error opening file for reading: %s\n", cue_path); - task_set_progress(task, 100); - task_free_title(task); - task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED))); - return; - } + /* open cuesheet file from drive */ + char cue_path[PATH_MAX_LENGTH] = {0}; - state->state = DUMP_STATE_WRITE_CUE; + cdrom_device_fillpath(cue_path, sizeof(cue_path), state->drive_letter[0], 0, true); - break; - } - case DUMP_STATE_WRITE_CUE: - { - /* write cuesheet to a file */ - int64_t cue_size = filestream_get_size(state->file); - char *cue_data = (char*)calloc(1, cue_size); - settings_t *settings = config_get_ptr(); - char output_file[PATH_MAX_LENGTH]; - char cue_filename[PATH_MAX_LENGTH]; + state->file = filestream_open(cue_path, RETRO_VFS_FILE_ACCESS_READ, 0); - output_file[0] = cue_filename[0] = '\0'; - - filestream_read(state->file, cue_data, cue_size); - - state->stream = filestream_get_vfs_handle(state->file); - state->toc = retro_vfs_file_get_cdrom_toc(); - - if (cdrom_has_atip(state->stream)) - RARCH_LOG("[CDROM]: This disc is not genuine.\n"); - - filestream_close(state->file); - - output_file[0] = cue_filename[0] = '\0'; - - snprintf(cue_filename, sizeof(cue_filename), "%s.cue", state->title); - - fill_pathname_join(output_file, settings->paths.directory_core_assets, - cue_filename, sizeof(output_file)); - - { - RFILE *file = filestream_open(output_file, RETRO_VFS_FILE_ACCESS_WRITE, 0); - unsigned char point = 0; - - if (!file) + if (!state->file) { - RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", output_file); + RARCH_ERR("[CDROM]: Error opening file for reading: %s\n", cue_path); task_set_progress(task, 100); task_free_title(task); - task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED))); + task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED))); return; } - for (point = 1; point <= state->toc->num_tracks; point++) + state->state = DUMP_STATE_WRITE_CUE; + + break; + } + case DUMP_STATE_WRITE_CUE: + { + char output_file[PATH_MAX_LENGTH]; + char cue_filename[PATH_MAX_LENGTH]; + /* write cuesheet to a file */ + int64_t cue_size = filestream_get_size(state->file); + char *cue_data = (char*)calloc(1, cue_size); + + output_file[0] = cue_filename[0] = '\0'; + + filestream_read(state->file, cue_data, cue_size); + + state->stream = filestream_get_vfs_handle(state->file); + state->toc = retro_vfs_file_get_cdrom_toc(); + + if (cdrom_has_atip(state->stream)) + RARCH_LOG("[CDROM]: This disc is not genuine.\n"); + + filestream_close(state->file); + + snprintf(cue_filename, sizeof(cue_filename), "%s.cue", state->title); + + fill_pathname_join(output_file, + directory_core_assets, cue_filename, sizeof(output_file)); + { - const char *track_type = "MODE1/2352"; + RFILE *file = filestream_open(output_file, RETRO_VFS_FILE_ACCESS_WRITE, 0); + unsigned char point = 0; + + if (!file) + { + RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", output_file); + task_set_progress(task, 100); + task_free_title(task); + task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED))); + return; + } + + for (point = 1; point <= state->toc->num_tracks; point++) + { + const char *track_type = "MODE1/2352"; + char track_filename[PATH_MAX_LENGTH]; + + state->disc_total_bytes += state->toc->track[point - 1].track_bytes; + + track_filename[0] = '\0'; + + if (state->toc->track[point - 1].audio) + track_type = "AUDIO"; + else if (state->toc->track[point - 1].mode == 1) + track_type = "MODE1/2352"; + else if (state->toc->track[point - 1].mode == 2) + track_type = "MODE2/2352"; + + snprintf(track_filename, sizeof(track_filename), "%s (Track %02d).bin", state->title, point); + + filestream_printf(file, "FILE \"%s\" BINARY\n", track_filename); + filestream_printf(file, " TRACK %02d %s\n", point, track_type); + + { + unsigned pregap_lba_len = state->toc->track[point - 1].lba - state->toc->track[point - 1].lba_start; + + if (state->toc->track[point - 1].audio && pregap_lba_len > 0) + { + unsigned char min = 0; + unsigned char sec = 0; + unsigned char frame = 0; + + cdrom_lba_to_msf(pregap_lba_len, &min, &sec, &frame); + + filestream_printf(file, " INDEX 00 00:00:00\n"); + filestream_printf(file, " INDEX 01 %02u:%02u:%02u\n", (unsigned)min, (unsigned)sec, (unsigned)frame); + } + else + filestream_printf(file, " INDEX 01 00:00:00\n"); + } + } + + filestream_close(file); + } + + state->file = NULL; + state->state = DUMP_STATE_NEXT_TRACK; + + free(cue_data); + } + break; + case DUMP_STATE_NEXT_TRACK: + { + /* no file is open as we either just started or just finished a track, need to start dumping the next track */ + state->cur_track++; + + /* no more tracks to dump, we're done */ + if (state->toc && state->cur_track > state->toc->num_tracks) + { + task_set_progress(task, 100); + return; + } + + RARCH_LOG("[CDROM]: Dumping track %d...\n", state->cur_track); + + memset(state->cdrom_path, 0, sizeof(state->cdrom_path)); + + cdrom_device_fillpath(state->cdrom_path, sizeof(state->cdrom_path), state->drive_letter[0], state->cur_track, false); + + state->track_written_bytes = 0; + state->file = filestream_open(state->cdrom_path, RETRO_VFS_FILE_ACCESS_READ, 0); + + /* open a new file for writing for this next track */ + if (state->file) + { + char output_path[PATH_MAX_LENGTH]; char track_filename[PATH_MAX_LENGTH]; - state->disc_total_bytes += state->toc->track[point - 1].track_bytes; + output_path[0] = track_filename[0] = '\0'; - track_filename[0] = '\0'; + snprintf(track_filename, sizeof(track_filename), "%s (Track %02d).bin", state->title, state->cur_track); - if (state->toc->track[point - 1].audio) - track_type = "AUDIO"; - else if (state->toc->track[point - 1].mode == 1) - track_type = "MODE1/2352"; - else if (state->toc->track[point - 1].mode == 2) - track_type = "MODE2/2352"; + state->cur_track_bytes = filestream_get_size(state->file); - snprintf(track_filename, sizeof(track_filename), "%s (Track %02d).bin", state->title, point); + fill_pathname_join(output_path, + directory_core_assets, track_filename, sizeof(output_path)); - filestream_printf(file, "FILE \"%s\" BINARY\n", track_filename); - filestream_printf(file, " TRACK %02d %s\n", point, track_type); + state->output_file = filestream_open(output_path, RETRO_VFS_FILE_ACCESS_WRITE, 0); + if (!state->output_file) { - unsigned pregap_lba_len = state->toc->track[point - 1].lba - state->toc->track[point - 1].lba_start; - - if (state->toc->track[point - 1].audio && pregap_lba_len > 0) - { - unsigned char min = 0; - unsigned char sec = 0; - unsigned char frame = 0; - - cdrom_lba_to_msf(pregap_lba_len, &min, &sec, &frame); - - filestream_printf(file, " INDEX 00 00:00:00\n"); - filestream_printf(file, " INDEX 01 %02u:%02u:%02u\n", (unsigned)min, (unsigned)sec, (unsigned)frame); - } - else - filestream_printf(file, " INDEX 01 00:00:00\n"); + RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", output_path); + task_set_progress(task, 100); + task_free_title(task); + task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED))); + return; } } - - filestream_close(file); - } - - state->file = NULL; - state->state = DUMP_STATE_NEXT_TRACK; - - free(cue_data); - - return; - } - case DUMP_STATE_NEXT_TRACK: - { - /* no file is open as we either just started or just finished a track, need to start dumping the next track */ - state->cur_track++; - - /* no more tracks to dump, we're done */ - if (state->toc && state->cur_track > state->toc->num_tracks) - { - task_set_progress(task, 100); - return; - } - - RARCH_LOG("[CDROM]: Dumping track %d...\n", state->cur_track); - - memset(state->cdrom_path, 0, sizeof(state->cdrom_path)); - - cdrom_device_fillpath(state->cdrom_path, sizeof(state->cdrom_path), state->drive_letter[0], state->cur_track, false); - - state->track_written_bytes = 0; - state->file = filestream_open(state->cdrom_path, RETRO_VFS_FILE_ACCESS_READ, 0); - - /* open a new file for writing for this next track */ - if (state->file) - { - settings_t *settings = config_get_ptr(); - char output_path[PATH_MAX_LENGTH]; - char track_filename[PATH_MAX_LENGTH]; - - output_path[0] = track_filename[0] = '\0'; - - snprintf(track_filename, sizeof(track_filename), "%s (Track %02d).bin", state->title, state->cur_track); - - state->cur_track_bytes = filestream_get_size(state->file); - - fill_pathname_join(output_path, settings->paths.directory_core_assets, - track_filename, sizeof(output_path)); - - state->output_file = filestream_open(output_path, RETRO_VFS_FILE_ACCESS_WRITE, 0); - - if (!state->output_file) + else { - RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", output_path); + RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", state->cdrom_path); task_set_progress(task, 100); task_free_title(task); task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED))); return; } - } - else - { - RARCH_ERR("[CDROM]: Error opening file for writing: %s\n", state->cdrom_path); - task_set_progress(task, 100); - task_free_title(task); - task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED))); - return; - } - state->state = DUMP_STATE_READ_TRACK; - return; - } + state->state = DUMP_STATE_READ_TRACK; + } + break; case DUMP_STATE_READ_TRACK: - { /* read data from track and write it to a file in chunks */ if (state->cur_track_bytes > state->track_written_bytes) { char data[2352 * 2] = {0}; - int64_t read_bytes = filestream_read(state->file, data, sizeof(data)); - int progress = 0; + int64_t read_bytes = filestream_read(state->file, data, sizeof(data)); + int progress = 0; if (read_bytes <= 0) { @@ -432,8 +429,6 @@ static void task_cdrom_dump_handler(retro_task_t *task) } task_set_progress(task, progress); - - return; } else if (state->cur_track_bytes == state->track_written_bytes) { @@ -450,11 +445,8 @@ static void task_cdrom_dump_handler(retro_task_t *task) } state->state = DUMP_STATE_NEXT_TRACK; - return; } - break; - } } } @@ -470,20 +462,20 @@ static void task_cdrom_dump_callback(retro_task_t *task, void task_push_cdrom_dump(const char *drive) { - retro_task_t *task = task_init(); + retro_task_t *task = task_init(); task_cdrom_dump_state_t *state = (task_cdrom_dump_state_t*)calloc(1, sizeof(*state)); - state->drive_letter[0] = drive[0]; - state->next = true; - state->cur_track = 0; - state->state = DUMP_STATE_TOC_PENDING; + state->drive_letter[0] = drive[0]; + state->next = true; + state->cur_track = 0; + state->state = DUMP_STATE_TOC_PENDING; fill_str_dated_filename(state->title, "cdrom", NULL, sizeof(state->title)); - task->state = state; - task->handler = task_cdrom_dump_handler; - task->callback = task_cdrom_dump_callback; - task->title = strdup(msg_hash_to_str(MSG_DUMPING_DISC)); + task->state = state; + task->handler = task_cdrom_dump_handler; + task->callback = task_cdrom_dump_callback; + task->title = strdup(msg_hash_to_str(MSG_DUMPING_DISC)); RARCH_LOG("[CDROM]: Starting disc dump...\n"); @@ -494,11 +486,9 @@ void task_push_cdrom_dump(const char *drive) static int64_t content_file_read(const char *path, void **buf, int64_t *length) { #ifdef HAVE_COMPRESSION - if (path_contains_compressed_file(path)) - { - if (file_archive_compressed_read(path, buf, NULL, length)) - return 1; - } + if ( path_contains_compressed_file(path) + && file_archive_compressed_read(path, buf, NULL, length)) + return 1; #endif return filestream_read_file(path, buf, length); } @@ -588,10 +578,8 @@ static bool content_load(content_ctx_info_t *info) int *rarch_argc_ptr = (int*)&info->argc; struct rarch_main_wrap *wrap_args = NULL; - wrap_args = (struct rarch_main_wrap*) - calloc(1, sizeof(*wrap_args)); - - if (!wrap_args) + if (!(wrap_args = (struct rarch_main_wrap*) + calloc(1, sizeof(*wrap_args)))) return false; retro_assert(wrap_args); @@ -1089,9 +1077,7 @@ static bool content_file_load( rcheevos_hardcore_paused = true; } else - { rcheevos_hardcore_paused = true; - } #endif return true;