diff --git a/libretro-common/streams/chd_stream.c b/libretro-common/streams/chd_stream.c index e5198df625..e0fa7fef90 100644 --- a/libretro-common/streams/chd_stream.c +++ b/libretro-common/streams/chd_stream.c @@ -29,6 +29,7 @@ #include #include #include +#include #define SECTOR_SIZE 2352 #define SUBCODE_SIZE 96 @@ -59,7 +60,8 @@ struct chdstream uint8_t *hunkmem; }; -typedef struct metadata { +typedef struct metadata +{ char type[64]; char subtype[32]; char pgtype[32]; @@ -165,7 +167,8 @@ chdstream_find_special_track(chd_file *fd, int32_t track, metadata_t *meta) *meta = iter; return true; } - else if (track == CHDSTREAM_TRACK_PRIMARY && largest_track != 0) + + if (track == CHDSTREAM_TRACK_PRIMARY && largest_track != 0) return chdstream_find_track_number(fd, largest_track, meta); return false; @@ -183,7 +186,7 @@ chdstream_find_special_track(chd_file *fd, int32_t track, metadata_t *meta) case CHDSTREAM_TRACK_PRIMARY: if (strcmp(iter.type, "AUDIO") && iter.frames > largest_size) { - largest_size = iter.frames; + largest_size = iter.frames; largest_track = iter.track; } break; @@ -205,13 +208,14 @@ chdstream_t *chdstream_open(const char *path, int32_t track) { metadata_t meta; uint32_t pregap = 0; + uint8_t *hunkmem = NULL; const chd_header *hd = NULL; chdstream_t *stream = NULL; chd_file *chd = NULL; chd_error err = chd_open(path, CHD_OPEN_READ, NULL, &chd); if (err != CHDERR_NONE) - goto error; + return NULL; if (!chdstream_find_track(chd, track, &meta)) goto error; @@ -221,43 +225,44 @@ chdstream_t *chdstream_open(const char *path, int32_t track) goto error; hd = chd_get_header(chd); - stream->hunkmem = (uint8_t*)malloc(hd->hunkbytes); - if (!stream->hunkmem) + hunkmem = (uint8_t*)malloc(hd->hunkbytes); + if (!hunkmem) goto error; - if (!strcmp(meta.type, "MODE1_RAW")) + stream->hunkmem = hunkmem; + + if (string_is_equal(meta.type, "MODE1_RAW")) { - stream->frame_size = SECTOR_SIZE; + stream->frame_size = SECTOR_SIZE; stream->frame_offset = 0; } - else if (!strcmp(meta.type, "MODE2_RAW")) + else if (string_is_equal(meta.type, "MODE2_RAW")) { - stream->frame_size = SECTOR_SIZE; + stream->frame_size = SECTOR_SIZE; stream->frame_offset = 0; } - else if (!strcmp(meta.type, "AUDIO")) + else if (string_is_equal(meta.type, "AUDIO")) { - stream->frame_size = SECTOR_SIZE; + stream->frame_size = SECTOR_SIZE; stream->frame_offset = 0; - stream->swab = true; + stream->swab = true; } else { - stream->frame_size = hd->unitbytes; + stream->frame_size = hd->unitbytes; stream->frame_offset = 0; } /* Only include pregap data if it was in the track file */ if (meta.pgtype[0] != 'V') - pregap = meta.pregap; - else - pregap = 0; + pregap = meta.pregap; stream->chd = chd; stream->frames_per_hunk = hd->hunkbytes / hd->unitbytes; stream->track_frame = meta.frame_offset; stream->track_start = (size_t)pregap * stream->frame_size; - stream->track_end = stream->track_start + (size_t)meta.frames * stream->frame_size; + stream->track_end = stream->track_start + + (size_t)meta.frames * stream->frame_size; stream->offset = 0; stream->hunknum = -1; @@ -288,22 +293,19 @@ void chdstream_close(chdstream_t *stream) static bool chdstream_load_hunk(chdstream_t *stream, uint32_t hunknum) { - chd_error err; uint16_t *array; - uint32_t i; - uint32_t count; if (hunknum == stream->hunknum) return true; - err = chd_read(stream->chd, hunknum, stream->hunkmem); - if (err != CHDERR_NONE) + if (chd_read(stream->chd, hunknum, stream->hunkmem) != CHDERR_NONE) return false; if (stream->swab) { - count = chd_get_header(stream->chd)->hunkbytes / 2; - array = (uint16_t*) stream->hunkmem; + uint32_t i; + uint32_t count = chd_get_header(stream->chd)->hunkbytes / 2; + array = (uint16_t*)stream->hunkmem; for (i = 0; i < count; ++i) array[i] = SWAP16(array[i]); } @@ -315,23 +317,20 @@ chdstream_load_hunk(chdstream_t *stream, uint32_t hunknum) ssize_t chdstream_read(chdstream_t *stream, void *data, size_t bytes) { size_t end; - uint32_t frame_offset; - uint32_t hunk_offset; - uint32_t chd_frame; - uint32_t hunk; - uint32_t amount; size_t data_offset = 0; const chd_header *hd = chd_get_header(stream->chd); uint8_t *out = (uint8_t*)data; if (stream->track_end - stream->offset < bytes) - bytes = stream->track_end - stream->offset; + bytes = stream->track_end - stream->offset; + + end = stream->offset + bytes; - end = stream->offset + bytes; while (stream->offset < end) { - frame_offset = stream->offset % stream->frame_size; - amount = stream->frame_size - frame_offset; + uint32_t frame_offset = stream->offset % stream->frame_size; + uint32_t amount = stream->frame_size - frame_offset; + if (amount > end - stream->offset) amount = (uint32_t)(end - stream->offset); @@ -340,15 +339,15 @@ ssize_t chdstream_read(chdstream_t *stream, void *data, size_t bytes) memset(out + data_offset, 0, amount); else { - chd_frame = (uint32_t)(stream->track_frame + + uint32_t chd_frame = (uint32_t)(stream->track_frame + (stream->offset - stream->track_start) / stream->frame_size); - hunk = chd_frame / stream->frames_per_hunk; - hunk_offset = (chd_frame % stream->frames_per_hunk) * hd->unitbytes; + uint32_t hunk = chd_frame / stream->frames_per_hunk; + uint32_t hunk_offset = (chd_frame % stream->frames_per_hunk) + * hd->unitbytes; if (!chdstream_load_hunk(stream, hunk)) - { return -1; - } + memcpy(out + data_offset, stream->hunkmem + frame_offset + hunk_offset + stream->frame_offset, amount); @@ -381,7 +380,7 @@ char *chdstream_gets(chdstream_t *stream, char *buffer, size_t len) buffer[offset++] = c; if (offset < len) - buffer[offset] = '\0'; + buffer[offset] = '\0'; return buffer; } @@ -432,9 +431,9 @@ ssize_t chdstream_get_size(chdstream_t *stream) uint32_t chdstream_get_track_start(chdstream_t *stream) { + uint32_t i; metadata_t meta; uint32_t frame_offset = 0; - uint32_t i; for (i = 0; chdstream_get_meta(stream->chd, i, &meta); ++i) {