Read tracks block.

This commit is contained in:
2019-03-18 00:10:24 +00:00
parent 7f5e38e52f
commit 7e5874aaaa
3 changed files with 55 additions and 12 deletions

View File

@@ -60,6 +60,8 @@ typedef struct dicformatContext
GeometryBlockHeader geometryBlock; GeometryBlockHeader geometryBlock;
MetadataBlockHeader metadataBlockHeader; MetadataBlockHeader metadataBlockHeader;
unsigned char *metadataBlock; unsigned char *metadataBlock;
TracksHeader tracksHeader;
TrackEntry *trackEntries;
} dicformatContext; } dicformatContext;
typedef struct dataLinkedList typedef struct dataLinkedList

View File

@@ -92,6 +92,7 @@ int close(void *context)
free(ctx->sectorSuffixDdt); free(ctx->sectorSuffixDdt);
free(ctx->metadataBlock); free(ctx->metadataBlock);
free(ctx->trackEntries);
free(context); free(context);

View File

@@ -440,7 +440,7 @@ void *open(const char *filepath)
if(readBytes != ddtHeader.entries * sizeof(uint32_t)) if(readBytes != ddtHeader.entries * sizeof(uint32_t))
{ {
free(data); free(data);
fprintf(stderr, "Could not read deduplication table, continuing..."); fprintf(stderr, "libdicformat: Could not read deduplication table, continuing...");
break; break;
} }
@@ -464,7 +464,7 @@ void *open(const char *filepath)
if(readBytes != sizeof(GeometryBlockHeader)) if(readBytes != sizeof(GeometryBlockHeader))
{ {
memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader));
fprintf(stderr, "Could not read geometry block, continuing..."); fprintf(stderr, "libdicformat: Could not read geometry block, continuing...");
break; break;
} }
@@ -496,7 +496,7 @@ void *open(const char *filepath)
if(readBytes != sizeof(MetadataBlockHeader)) if(readBytes != sizeof(MetadataBlockHeader))
{ {
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
fprintf(stderr, "Could not read metadata block header, continuing..."); fprintf(stderr, "libdicformat: Could not read metadata block header, continuing...");
break; break;
} }
@@ -504,7 +504,6 @@ void *open(const char *filepath)
{ {
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
fprintf(stderr, fprintf(stderr,
"libdicformat: Incorrect identifier for data block at position %"PRIu64"", "libdicformat: Incorrect identifier for data block at position %"PRIu64"",
idxEntries[i].offset); idxEntries[i].offset);
break; break;
@@ -525,12 +524,53 @@ void *open(const char *filepath)
{ {
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
free(ctx->metadataBlock); free(ctx->metadataBlock);
fprintf(stderr, "Could not read metadata block, continuing..."); fprintf(stderr, "libdicformat: Could not read metadata block, continuing...");
} }
break; break;
case TracksBlock: case TracksBlock: readBytes = fread(&ctx->tracksHeader, sizeof(TracksHeader), 1, ctx->imageStream);
// TODO
if(readBytes != sizeof(TracksHeader))
{
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
fprintf(stderr, "libdicformat: Could not read tracks header, continuing...");
break;
}
if(ctx->tracksHeader.identifier != TracksBlock)
{
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
fprintf(stderr,
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
idxEntries[i].offset);
}
ctx->trackEntries = malloc(sizeof(TrackEntry) * ctx->tracksHeader.entries);
if(ctx->trackEntries == NULL)
{
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
fprintf(stderr, "libdicformat: Could not allocate memory for metadata block, continuing...");
break;
}
readBytes = fread(ctx->trackEntries, sizeof(TrackEntry), ctx->tracksHeader.entries, ctx->imageStream);
if(readBytes != ctx->metadataBlockHeader.blockSize)
{
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
free(ctx->trackEntries);
fprintf(stderr, "libdicformat: Could not read metadata block, continuing...");
}
fprintf(stderr,
"libdicformat: Found %d tracks at position %"PRIu64".",
ctx->tracksHeader.entries,
idxEntries[i].offset);
// TODO: Cache flags and ISRCs
// TODO: ImageInfo
break; break;
case CicmBlock: case CicmBlock:
// TODO // TODO