mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-01-29 19:15:38 +00:00
dep/libchdr: Add chd_precache_progress()
Alternative which reports back as the file is read.
This commit is contained in:
parent
bceca040d9
commit
ec9411c0a7
|
@ -375,6 +375,7 @@ CHD_EXPORT chd_error chd_open(const char *filename, int mode, chd_file *parent,
|
||||||
|
|
||||||
/* precache underlying file */
|
/* precache underlying file */
|
||||||
CHD_EXPORT chd_error chd_precache(chd_file *chd);
|
CHD_EXPORT chd_error chd_precache(chd_file *chd);
|
||||||
|
CHD_EXPORT chd_error chd_precache_progress(chd_file* chd, void(*progress)(size_t pos, size_t total, void* param), void* param);
|
||||||
|
|
||||||
/* close a CHD file */
|
/* close a CHD file */
|
||||||
CHD_EXPORT void chd_close(chd_file *chd);
|
CHD_EXPORT void chd_close(chd_file *chd);
|
||||||
|
|
|
@ -4,21 +4,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifdef USE_LIBRETRO_VFS
|
|
||||||
#include <streams/file_stream_transforms.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
|
#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
|
||||||
|
|
||||||
#if defined(__PS3__) || defined(__PSL1GHT__)
|
|
||||||
#undef UINT32
|
|
||||||
#undef UINT16
|
|
||||||
#undef UINT8
|
|
||||||
#undef INT32
|
|
||||||
#undef INT16
|
|
||||||
#undef INT8
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef uint64_t UINT64;
|
typedef uint64_t UINT64;
|
||||||
typedef uint32_t UINT32;
|
typedef uint32_t UINT32;
|
||||||
typedef uint16_t UINT16;
|
typedef uint16_t UINT16;
|
||||||
|
@ -32,10 +19,7 @@ typedef int8_t INT8;
|
||||||
#define core_file FILE
|
#define core_file FILE
|
||||||
#define core_fopen(file) fopen(file, "rb")
|
#define core_fopen(file) fopen(file, "rb")
|
||||||
|
|
||||||
#if defined USE_LIBRETRO_VFS
|
#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WIN64__)
|
||||||
#define core_fseek fseek
|
|
||||||
#define core_ftell ftell
|
|
||||||
#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WIN64__)
|
|
||||||
#define core_fseek _fseeki64
|
#define core_fseek _fseeki64
|
||||||
#define core_ftell _ftelli64
|
#define core_ftell _ftelli64
|
||||||
#elif defined(_LARGEFILE_SOURCE) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
|
#elif defined(_LARGEFILE_SOURCE) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
|
||||||
|
@ -51,7 +35,7 @@ typedef int8_t INT8;
|
||||||
#define core_fread(fc, buff, len) fread(buff, 1, len, fc)
|
#define core_fread(fc, buff, len) fread(buff, 1, len, fc)
|
||||||
#define core_fclose fclose
|
#define core_fclose fclose
|
||||||
|
|
||||||
static UINT64 core_fsize(core_file *f)
|
static inline UINT64 core_fsize(core_file *f)
|
||||||
{
|
{
|
||||||
UINT64 rv;
|
UINT64 rv;
|
||||||
UINT64 p = core_ftell(f);
|
UINT64 p = core_ftell(f);
|
||||||
|
|
|
@ -1530,12 +1530,19 @@ cleanup:
|
||||||
memory
|
memory
|
||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
|
|
||||||
CHD_EXPORT chd_error chd_precache(chd_file *chd)
|
CHD_EXPORT chd_error chd_precache(chd_file* chd)
|
||||||
{
|
{
|
||||||
|
return chd_precache_progress(chd, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHD_EXPORT chd_error chd_precache_progress(chd_file *chd, void(*progress)(size_t pos, size_t total, void* param), void* param)
|
||||||
|
{
|
||||||
|
#define PRECACHE_CHUNK_SIZE 16 * 1024 * 1024
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
size_t size, count;
|
size_t size, done, req_count, count, last_update_done, update_interval;
|
||||||
#else
|
#else
|
||||||
ssize_t size, count;
|
ssize_t size, done, req_count, count, last_update_done, update_interval;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (chd->file_cache == NULL)
|
if (chd->file_cache == NULL)
|
||||||
|
@ -1548,12 +1555,31 @@ CHD_EXPORT chd_error chd_precache(chd_file *chd)
|
||||||
if (chd->file_cache == NULL)
|
if (chd->file_cache == NULL)
|
||||||
return CHDERR_OUT_OF_MEMORY;
|
return CHDERR_OUT_OF_MEMORY;
|
||||||
core_fseek(chd->file, 0, SEEK_SET);
|
core_fseek(chd->file, 0, SEEK_SET);
|
||||||
count = core_fread(chd->file, chd->file_cache, size);
|
|
||||||
if (count != size)
|
done = 0;
|
||||||
|
last_update_done = 0;
|
||||||
|
update_interval = ((size + 99) / 100);
|
||||||
|
|
||||||
|
while (done < size)
|
||||||
{
|
{
|
||||||
free(chd->file_cache);
|
req_count = size - done;
|
||||||
chd->file_cache = NULL;
|
if (req_count > PRECACHE_CHUNK_SIZE)
|
||||||
return CHDERR_READ_ERROR;
|
req_count = PRECACHE_CHUNK_SIZE;
|
||||||
|
|
||||||
|
count = core_fread(chd->file, chd->file_cache + done, req_count);
|
||||||
|
if (count != req_count)
|
||||||
|
{
|
||||||
|
free(chd->file_cache);
|
||||||
|
chd->file_cache = NULL;
|
||||||
|
return CHDERR_READ_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
done += req_count;
|
||||||
|
if (progress != NULL && (done - last_update_done) >= update_interval && done != size)
|
||||||
|
{
|
||||||
|
last_update_done = done;
|
||||||
|
progress(done, size, param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue