Virtual ISO: Initial commit
This commit is contained in:
@@ -13,4 +13,4 @@
|
|||||||
# Copyright 2020,2021 David Hrdlička.
|
# Copyright 2020,2021 David Hrdlička.
|
||||||
#
|
#
|
||||||
|
|
||||||
add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image.c)
|
add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c)
|
||||||
|
|||||||
@@ -285,11 +285,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
|||||||
dev->image = img;
|
dev->image = img;
|
||||||
|
|
||||||
/* Open the image. */
|
/* Open the image. */
|
||||||
if (!cdi_set_device(img, fn))
|
int i = cdi_set_device(img, fn);
|
||||||
|
if (!i)
|
||||||
return image_open_abort(dev);
|
return image_open_abort(dev);
|
||||||
|
|
||||||
/* All good, reset state. */
|
/* All good, reset state. */
|
||||||
if (! strcasecmp(plat_get_extension((char *) fn), "ISO"))
|
if (i == 2)
|
||||||
dev->cd_status = CD_STATUS_DATA_ONLY;
|
dev->cd_status = CD_STATUS_DATA_ONLY;
|
||||||
else
|
else
|
||||||
dev->cd_status = CD_STATUS_STOPPED;
|
dev->cd_status = CD_STATUS_STOPPED;
|
||||||
|
|||||||
@@ -20,24 +20,22 @@
|
|||||||
#define _LARGEFILE_SOURCE
|
#define _LARGEFILE_SOURCE
|
||||||
#define _LARGEFILE64_SOURCE
|
#define _LARGEFILE64_SOURCE
|
||||||
#define __STDC_FORMAT_MACROS
|
#define __STDC_FORMAT_MACROS
|
||||||
#include <stdarg.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
#else
|
#else
|
||||||
# include <libgen.h>
|
# include <libgen.h>
|
||||||
#endif
|
#endif
|
||||||
#include <wchar.h>
|
|
||||||
#define HAVE_STDARG_H
|
#define HAVE_STDARG_H
|
||||||
#include <86box/86box.h>
|
#include <86box/86box.h>
|
||||||
#include <86box/plat.h>
|
|
||||||
#include <86box/cdrom_image_backend.h>
|
#include <86box/cdrom_image_backend.h>
|
||||||
|
#include <86box/plat.h>
|
||||||
|
|
||||||
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||||
|
|
||||||
@@ -45,14 +43,11 @@
|
|||||||
#define MAX_FILENAME_LENGTH 256
|
#define MAX_FILENAME_LENGTH 256
|
||||||
#define CROSS_LEN 512
|
#define CROSS_LEN 512
|
||||||
|
|
||||||
|
|
||||||
static char temp_keyword[1024];
|
static char temp_keyword[1024];
|
||||||
|
|
||||||
|
|
||||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||||
int cdrom_image_backend_do_log = ENABLE_CDROM_IMAGE_BACKEND_LOG;
|
int cdrom_image_backend_do_log = ENABLE_CDROM_IMAGE_BACKEND_LOG;
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cdrom_image_backend_log(const char *fmt, ...)
|
cdrom_image_backend_log(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
@@ -68,7 +63,6 @@ cdrom_image_backend_log(const char *fmt, ...)
|
|||||||
# define cdrom_image_backend_log(fmt, ...)
|
# define cdrom_image_backend_log(fmt, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Binary file functions. */
|
/* Binary file functions. */
|
||||||
static int
|
static int
|
||||||
bin_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
bin_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
||||||
@@ -98,7 +92,6 @@ bin_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uint64_t
|
static uint64_t
|
||||||
bin_get_length(void *p)
|
bin_get_length(void *p)
|
||||||
{
|
{
|
||||||
@@ -117,7 +110,6 @@ bin_get_length(void *p)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bin_close(void *p)
|
bin_close(void *p)
|
||||||
{
|
{
|
||||||
@@ -136,7 +128,6 @@ bin_close(void *p)
|
|||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static track_file_t *
|
static track_file_t *
|
||||||
bin_init(const char *filename, int *error)
|
bin_init(const char *filename, int *error)
|
||||||
{
|
{
|
||||||
@@ -167,7 +158,6 @@ bin_init(const char *filename, int *error)
|
|||||||
return tf;
|
return tf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static track_file_t *
|
static track_file_t *
|
||||||
track_file_init(const char *filename, int *error)
|
track_file_init(const char *filename, int *error)
|
||||||
{
|
{
|
||||||
@@ -176,7 +166,6 @@ track_file_init(const char *filename, int *error)
|
|||||||
return bin_init(filename, error);
|
return bin_init(filename, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
track_file_close(track_t *trk)
|
track_file_close(track_t *trk)
|
||||||
{
|
{
|
||||||
@@ -193,7 +182,6 @@ track_file_close(track_t *trk)
|
|||||||
trk->file = NULL;
|
trk->file = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Root functions. */
|
/* Root functions. */
|
||||||
static void
|
static void
|
||||||
cdi_clear_tracks(cd_img_t *cdi)
|
cdi_clear_tracks(cd_img_t *cdi)
|
||||||
@@ -224,7 +212,6 @@ cdi_clear_tracks(cd_img_t *cdi)
|
|||||||
cdi->tracks_num = 0;
|
cdi->tracks_num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cdi_close(cd_img_t *cdi)
|
cdi_close(cd_img_t *cdi)
|
||||||
{
|
{
|
||||||
@@ -232,7 +219,6 @@ cdi_close(cd_img_t *cdi)
|
|||||||
free(cdi);
|
free(cdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_set_device(cd_img_t *cdi, const char *path)
|
cdi_set_device(cd_img_t *cdi, const char *path)
|
||||||
{
|
{
|
||||||
@@ -240,12 +226,11 @@ cdi_set_device(cd_img_t *cdi, const char *path)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (cdi_load_iso(cdi, path))
|
if (cdi_load_iso(cdi, path))
|
||||||
return 1;
|
return 2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: This never returns anything other than 1, should it even be an int? */
|
/* TODO: This never returns anything other than 1, should it even be an int? */
|
||||||
int
|
int
|
||||||
cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out)
|
cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out)
|
||||||
@@ -257,7 +242,6 @@ cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: This never returns anything other than 1, should it even be an int? */
|
/* TODO: This never returns anything other than 1, should it even be an int? */
|
||||||
int
|
int
|
||||||
cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_out)
|
cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_out)
|
||||||
@@ -269,7 +253,6 @@ cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_get_audio_track_pre(cd_img_t *cdi, int track)
|
cdi_get_audio_track_pre(cd_img_t *cdi, int track)
|
||||||
{
|
{
|
||||||
@@ -281,7 +264,6 @@ cdi_get_audio_track_pre(cd_img_t *cdi, int track)
|
|||||||
return trk->pre;
|
return trk->pre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This replaces both Info and EndInfo, they are specified by a variable. */
|
/* This replaces both Info and EndInfo, they are specified by a variable. */
|
||||||
int
|
int
|
||||||
cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF *start, uint8_t *attr)
|
cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF *start, uint8_t *attr)
|
||||||
@@ -302,7 +284,6 @@ cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num, uint32_t *start, uint8_t *attr)
|
cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num, uint32_t *start, uint8_t *attr)
|
||||||
{
|
{
|
||||||
@@ -319,7 +300,6 @@ cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
||||||
{
|
{
|
||||||
@@ -342,7 +322,6 @@ cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: See if track start is adjusted by 150 or not. */
|
/* TODO: See if track start is adjusted by 150 or not. */
|
||||||
int
|
int
|
||||||
cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos)
|
cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos)
|
||||||
@@ -366,7 +345,6 @@ cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||||
{
|
{
|
||||||
@@ -429,7 +407,6 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
|||||||
return trk->file->read(trk->file, buffer, seek, length);
|
return trk->file->read(trk->file, buffer, seek, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
||||||
{
|
{
|
||||||
@@ -456,7 +433,6 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: Do CUE+BIN images with a sector size of 2448 even exist? */
|
/* TODO: Do CUE+BIN images with a sector size of 2448 even exist? */
|
||||||
int
|
int
|
||||||
cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector)
|
cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector)
|
||||||
@@ -476,7 +452,6 @@ cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector)
|
|||||||
return trk->file->read(trk->file, buffer, seek, 2448);
|
return trk->file->read(trk->file, buffer, seek, 2448);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_get_sector_size(cd_img_t *cdi, uint32_t sector)
|
cdi_get_sector_size(cd_img_t *cdi, uint32_t sector)
|
||||||
{
|
{
|
||||||
@@ -490,7 +465,6 @@ cdi_get_sector_size(cd_img_t *cdi, uint32_t sector)
|
|||||||
return trk->sector_size;
|
return trk->sector_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_is_mode2(cd_img_t *cdi, uint32_t sector)
|
cdi_is_mode2(cd_img_t *cdi, uint32_t sector)
|
||||||
{
|
{
|
||||||
@@ -505,7 +479,6 @@ cdi_is_mode2(cd_img_t *cdi, uint32_t sector)
|
|||||||
return !!(trk->mode2);
|
return !!(trk->mode2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector)
|
cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector)
|
||||||
{
|
{
|
||||||
@@ -520,7 +493,6 @@ cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector)
|
|||||||
return trk->form;
|
return trk->form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form)
|
cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form)
|
||||||
{
|
{
|
||||||
@@ -534,11 +506,9 @@ cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form)
|
|||||||
|
|
||||||
file->read(file, pvd, seek, COOKED_SECTOR_SIZE);
|
file->read(file, pvd, seek, COOKED_SECTOR_SIZE);
|
||||||
|
|
||||||
return ((pvd[0] == 1 && !strncmp((char*)(&pvd[1]), "CD001", 5) && pvd[6] == 1) ||
|
return ((pvd[0] == 1 && !strncmp((char *) (&pvd[1]), "CD001", 5) && pvd[6] == 1) || (pvd[8] == 1 && !strncmp((char *) (&pvd[9]), "CDROM", 5) && pvd[14] == 1));
|
||||||
(pvd[8] == 1 && !strncmp((char*)(&pvd[9]), "CDROM", 5) && pvd[14] == 1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This reallocates the array and returns the pointer to the last track. */
|
/* This reallocates the array and returns the pointer to the last track. */
|
||||||
static void
|
static void
|
||||||
cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
||||||
@@ -555,7 +525,6 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
|||||||
cdi->tracks_num++;
|
cdi->tracks_num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_load_iso(cd_img_t *cdi, const char *filename)
|
cdi_load_iso(cd_img_t *cdi, const char *filename)
|
||||||
{
|
{
|
||||||
@@ -569,11 +538,16 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
|
|||||||
|
|
||||||
/* Data track (shouldn't there be a lead in track?). */
|
/* Data track (shouldn't there be a lead in track?). */
|
||||||
trk.file = bin_init(filename, &error);
|
trk.file = bin_init(filename, &error);
|
||||||
|
if (error) {
|
||||||
|
if ((trk.file != NULL) && (trk.file->close != NULL))
|
||||||
|
trk.file->close(trk.file);
|
||||||
|
trk.file = viso_init(filename, &error);
|
||||||
if (error) {
|
if (error) {
|
||||||
if ((trk.file != NULL) && (trk.file->close != NULL))
|
if ((trk.file != NULL) && (trk.file->close != NULL))
|
||||||
trk.file->close(trk.file);
|
trk.file->close(trk.file);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
trk.number = 1;
|
trk.number = 1;
|
||||||
trk.track_number = 1;
|
trk.track_number = 1;
|
||||||
trk.attr = DATA_TRACK;
|
trk.attr = DATA_TRACK;
|
||||||
@@ -615,7 +589,6 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_cue_get_buffer(char *str, char **line, int up)
|
cdi_cue_get_buffer(char *str, char **line, int up)
|
||||||
{
|
{
|
||||||
@@ -640,7 +613,8 @@ cdi_cue_get_buffer(char *str, char **line, int up)
|
|||||||
quote ^= 1;
|
quote ^= 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ' ': case '\t':
|
case ' ':
|
||||||
|
case '\t':
|
||||||
if (space)
|
if (space)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -669,7 +643,6 @@ cdi_cue_get_buffer(char *str, char **line, int up)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_cue_get_keyword(char **dest, char **line)
|
cdi_cue_get_keyword(char **dest, char **line)
|
||||||
{
|
{
|
||||||
@@ -682,7 +655,6 @@ cdi_cue_get_keyword(char **dest, char **line)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Get a string from the input line, handling quotes properly. */
|
/* Get a string from the input line, handling quotes properly. */
|
||||||
static uint64_t
|
static uint64_t
|
||||||
cdi_cue_get_number(char **line)
|
cdi_cue_get_number(char **line)
|
||||||
@@ -699,7 +671,6 @@ cdi_cue_get_number(char **line)
|
|||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_cue_get_frame(uint64_t *frames, char **line)
|
cdi_cue_get_frame(uint64_t *frames, char **line)
|
||||||
{
|
{
|
||||||
@@ -720,7 +691,6 @@ cdi_cue_get_frame(uint64_t *frames, char **line)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_cue_get_flags(track_t *cur, char **line)
|
cdi_cue_get_flags(track_t *cur, char **line)
|
||||||
{
|
{
|
||||||
@@ -741,7 +711,6 @@ cdi_cue_get_flags(track_t *cur, char **line)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, uint64_t *total_pregap, uint64_t cur_pregap)
|
cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, uint64_t *total_pregap, uint64_t cur_pregap)
|
||||||
{
|
{
|
||||||
@@ -809,7 +778,6 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||||
{
|
{
|
||||||
@@ -1006,9 +974,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
|||||||
success = cdi_cue_get_frame(&cur_pregap, &line);
|
success = cdi_cue_get_frame(&cur_pregap, &line);
|
||||||
else if (!strcmp(command, "FLAGS"))
|
else if (!strcmp(command, "FLAGS"))
|
||||||
success = cdi_cue_get_flags(&trk, &line);
|
success = cdi_cue_get_flags(&trk, &line);
|
||||||
else if (!strcmp(command, "CATALOG") || !strcmp(command, "CDTEXTFILE") || !strcmp(command, "ISRC") ||
|
else if (!strcmp(command, "CATALOG") || !strcmp(command, "CDTEXTFILE") || !strcmp(command, "ISRC") || !strcmp(command, "PERFORMER") || !strcmp(command, "POSTGAP") || !strcmp(command, "REM") || !strcmp(command, "SONGWRITER") || !strcmp(command, "TITLE") || !strcmp(command, "")) {
|
||||||
!strcmp(command, "PERFORMER") || !strcmp(command, "POSTGAP") || !strcmp(command, "REM") ||
|
|
||||||
!strcmp(command, "SONGWRITER") || !strcmp(command, "TITLE") || !strcmp(command, "")) {
|
|
||||||
/* Ignored commands. */
|
/* Ignored commands. */
|
||||||
success = 1;
|
success = 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -1043,7 +1009,6 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_has_data_track(cd_img_t *cdi)
|
cdi_has_data_track(cd_img_t *cdi)
|
||||||
{
|
{
|
||||||
@@ -1061,7 +1026,6 @@ cdi_has_data_track(cd_img_t *cdi)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_has_audio_track(cd_img_t *cdi)
|
cdi_has_audio_track(cd_img_t *cdi)
|
||||||
{
|
{
|
||||||
|
|||||||
1112
src/cdrom/cdrom_image_viso.c
Normal file
1112
src/cdrom/cdrom_image_viso.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,7 @@ typedef struct {
|
|||||||
|
|
||||||
char fn[260];
|
char fn[260];
|
||||||
FILE *file;
|
FILE *file;
|
||||||
|
void *priv;
|
||||||
} track_file_t;
|
} track_file_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -89,5 +90,11 @@ extern int cdi_load_cue(cd_img_t *cdi, const char *cuefile);
|
|||||||
extern int cdi_has_data_track(cd_img_t *cdi);
|
extern int cdi_has_data_track(cd_img_t *cdi);
|
||||||
extern int cdi_has_audio_track(cd_img_t *cdi);
|
extern int cdi_has_audio_track(cd_img_t *cdi);
|
||||||
|
|
||||||
|
/* Virtual ISO functions. */
|
||||||
|
extern int viso_read(void *p, uint8_t *buffer, uint64_t seek, size_t count);
|
||||||
|
extern uint64_t viso_get_length(void *p);
|
||||||
|
extern void viso_close(void *p);
|
||||||
|
extern track_file_t *viso_init(const char *dirname, int *error);
|
||||||
|
|
||||||
|
|
||||||
#endif /*CDROM_IMAGE_BACKEND_H*/
|
#endif /*CDROM_IMAGE_BACKEND_H*/
|
||||||
|
|||||||
@@ -618,7 +618,7 @@ MINIVHDOBJ := cwalk.o libxml2_encoding.o minivhd_convert.o \
|
|||||||
minivhd_struct_rw.o minivhd_util.o
|
minivhd_struct_rw.o minivhd_util.o
|
||||||
|
|
||||||
CDROMOBJ := cdrom.o \
|
CDROMOBJ := cdrom.o \
|
||||||
cdrom_image_backend.o cdrom_image.o
|
cdrom_image_backend.o cdrom_image_viso.o cdrom_image.o
|
||||||
|
|
||||||
ZIPOBJ := zip.o
|
ZIPOBJ := zip.o
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user