shithub: psxe

Download patch

ref: a8b8eafddf537c89f3c7e8834b3bf2a41a4ba4e2
parent: d8352d0c7951373a05c0189c1f379d2e6558c7f7
author: allkern <lisandroaalarcon@gmail.com>
date: Fri Sep 1 16:56:41 EDT 2023

Implement remaining CUE functions

--- a/psx/disc.c
+++ b/psx/disc.c
@@ -31,6 +31,10 @@
     return disc->read_sector_func(disc->udata, buf);
 }
 
-int psx_disc_get_track(psx_disc_t* disc, msf_t* msf, int track) {
-    return disc->get_track_func(disc->udata, msf, track);
+int psx_disc_get_track_addr(psx_disc_t* disc, msf_t* msf, int track) {
+    return disc->get_track_addr_func(disc->udata, msf, track);
+}
+
+int psx_disc_get_track_count(psx_disc_t* disc, int* count) {
+    return disc->get_track_count_func(disc->udata, count);
 }
\ No newline at end of file
--- a/psx/disc.h
+++ b/psx/disc.h
@@ -11,15 +11,21 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+enum {
+    DISC_ERR_TRACK_OUT_OF_BOUNDS = 1,
+    DISC_ERR_ADDR_OUT_OF_BOUNDS
+};
+
 typedef struct {
-    uint8_t m;
-    uint8_t s;
-    uint8_t f;
+    uint32_t m;
+    uint32_t s;
+    uint32_t f;
 } msf_t;
 
 typedef int (*disc_seek_t)(void*, msf_t);
 typedef int (*disc_read_sector_t)(void*, void*);
-typedef int (*disc_get_track_t)(void*, msf_t*, int);
+typedef int (*disc_get_track_addr_t)(void*, msf_t*, int);
+typedef int (*disc_get_track_count_t)(void*, int*);
 
 typedef struct {
     void* udata;
@@ -26,12 +32,14 @@
 
     disc_seek_t seek_func;
     disc_read_sector_t read_sector_func;
-    disc_get_track_t get_track_func;
+    disc_get_track_addr_t get_track_addr_func;
+    disc_get_track_count_t get_track_count_func;
 } psx_disc_t;
 
 psx_disc_t* psx_disc_create();
 int psx_disc_seek(psx_disc_t*, msf_t);
 int psx_disc_read_sector(psx_disc_t*, void*);
-int psx_disc_get_track(psx_disc_t*, msf_t*, int);
+int psx_disc_get_track_addr(psx_disc_t*, msf_t*, int);
+int psx_disc_get_track_count(psx_disc_t*, int*);
 
 #endif
\ No newline at end of file
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -292,35 +292,50 @@
 // To-do: Rework CUE loader
 //        I want to put every track one after the other
 //        on a big buffer for absolute MSF addressing.
-//        We should also save metadata about the tracks on
+//        We should also save metadata about the tracks in
 //        the CUE struct.
 
 void psxd_cue_load(psxd_cue_t* cue) {
     size_t offset = 0;
 
-    uint8_t* buf = NULL;
+    void* buf = NULL;
 
     for (int i = 0; i < cue->num_tracks; i++) {
         cue_track_t* track = cue->track[i];
 
-        FILE* file = fopen(cue->track[i]->filename, "rb");
+        FILE* file = fopen(track->filename, "rb");
 
+        // Get track size
         fseek(file, 0, SEEK_END);
 
         track->size = ftell(file);
 
-        buf = cue_alloc_block(buf, offset, track->size);
+        // Calculate track MS(F)
+        track->disc_offset.f = offset / CUE_SECTOR_SIZE;
+        track->disc_offset.s = track->disc_offset.f / CUE_SECTORS_PER_SECOND;
+        track->disc_offset.m = track->disc_offset.s / 60;
+        track->disc_offset.s -= track->disc_offset.m * 60;
 
+        buf = cue_alloc_block(buf, &offset, track->size);
+
         fseek(file, 0, SEEK_SET);
-        fread(buf + (offset - track->size), 1, track->size, file);
+        fread((uint8_t*)buf + (offset - track->size), 1, track->size, file);
 
         fclose(file);
     }
+
+    cue->end.f = offset / CUE_SECTOR_SIZE;
+    cue->end.s = cue->end.f / CUE_SECTORS_PER_SECOND;
+    cue->end.m = cue->end.s / 60;
+    cue->end.s -= cue->end.m * 60;
+    cue->end.f -= (cue->end.m * 60) + (cue->end.s * CUE_SECTORS_PER_SECOND);
 }
 
 int psxd_cue_seek(void* udata, msf_t msf) {
     psxd_cue_t* cue = udata;
 
+    // To-do: Check for OOB seeks
+
     uint32_t sectors = (((msf.m * 60) + msf.s) * CUE_SECTORS_PER_SECOND) + msf.f;
 
     cue->seek_offset = sectors * CUE_SECTOR_SIZE;
@@ -331,23 +346,42 @@
 int psxd_cue_read_sector(void* udata, void* buf) {
     psxd_cue_t* cue = udata;
 
+    memcpy(buf, &cue->buf[cue->seek_offset], CUE_SECTOR_SIZE);
+
+    return 0;
 }
 
-int psxd_cue_get_track(void* udata, msf_t* msf, int track) {
+int psxd_cue_get_track_addr(void* udata, msf_t* msf, int track) {
+    psxd_cue_t* cue = udata;
+
+    if (track > cue->num_tracks)
+        return DISC_ERR_TRACK_OUT_OF_BOUNDS;
+    
+    msf->m = cue->track[track]->disc_offset.m;
+    msf->s = cue->track[track]->disc_offset.s;
+
+    return 0;
 }
 
+int psxd_cue_get_track_count(void* udata, int* count) {
+    psxd_cue_t* cue = udata;
+
+    *count = cue->num_tracks;
+
+    return 0;
+}
+
 void psxd_cue_init_disc(psxd_cue_t* cue, psx_disc_t* disc) {
     disc->udata = cue;
     disc->seek_func = psxd_cue_seek;
     disc->read_sector_func = psxd_cue_read_sector;
-    disc->get_track_func = psxd_cue_get_track;
+    disc->get_track_addr_func = psxd_cue_get_track_addr;
+    disc->get_track_count_func = psxd_cue_get_track_count;
 }
 
 void psxd_cue_destroy(psxd_cue_t* cue) {
     for (int i = 0; i < cue->num_tracks; i++) {
-        if (cue->preload)
-            fclose((FILE*)cue->track[i]->buf);
-        
+        free(cue->track[i]->filename);
         free(cue->track[i]);
     }
 
--- a/psx/disc/cue.h
+++ b/psx/disc/cue.h
@@ -78,6 +78,7 @@
     cue_track_t** track;
     char* current_file;
     uint32_t seek_offset;
+    msf_t end;
 } psxd_cue_t;
 
 psxd_cue_t* psxd_cue_create();
--