static uae_u8 *flac_get_data (struct cdtoc *t) { write_log (_T("FLAC: unpacking '%s'..\n"), zfile_getname (t->handle)); t->writeoffset = 0; FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new (); if (decoder) { FLAC__stream_decoder_set_md5_checking (decoder, false); int init_status = FLAC__stream_decoder_init_stream (decoder, &file_read_callback, &file_seek_callback, &file_tell_callback, &file_len_callback, &file_eof_callback, &flac_write_callback, &flac_metadata_callback, &flac_error_callback, t); FLAC__stream_decoder_process_until_end_of_stream (decoder); FLAC__stream_decoder_delete (decoder); write_log (_T("FLAC: %s unpacked\n"), zfile_getname (t->handle)); } return t->data; }
static int diskswapper_cb (struct zfile *f, void *vrsd) { int *num = (int*)vrsd; if (*num >= MAX_SPARE_DRIVES) return 1; if (zfile_gettype (f) == ZFILE_DISKIMAGE) { _tcsncpy (currprefs.dfxlist[*num], zfile_getname (f), 255); (*num)++; } return 0; }
static int parsechd (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img) { chd_error err; struct cdrom_file *cdf; struct zfile *f = zfile_dup (zcue); if (!f) return 0; chd_file *cf = new chd_file(); err = cf->open(f, false, NULL); if (err != CHDERR_NONE) { write_log (_T("CHD '%s' err=%d\n"), zfile_getname (zcue), err); zfile_fclose (f); return 0; } if (!(cdf = cdrom_open (cf))) { write_log (_T("Couldn't open CHD '%s' as CD\n"), zfile_getname (zcue)); cf->close (); zfile_fclose (f); return 0; } cdu->chd_f = cf; cdu->chd_cdf = cdf; const cdrom_toc *stoc = cdrom_get_toc (cdf); cdu->tracks = stoc->numtrks; uae_u32 hunkcnt = cf->hunk_count (); uae_u32 hunksize = cf->hunk_bytes (); uae_u32 cbytes; chd_codec_type compr; for (int i = 0; i <cdu->tracks; i++) { int size; const cdrom_track_info *strack = &stoc->tracks[i]; struct cdtoc *dtrack = &cdu->toc[i]; dtrack->address = strack->physframeofs; dtrack->offset = strack->chdframeofs; dtrack->adr = cdrom_get_adr_control (cdf, i) >> 4; dtrack->ctrl = cdrom_get_adr_control (cdf, i) & 15; switch (strack->trktype) { case CD_TRACK_MODE1: case CD_TRACK_MODE2_FORM1: size = 2048; break; case CD_TRACK_MODE1_RAW: case CD_TRACK_MODE2_RAW: case CD_TRACK_AUDIO: default: size = 2352; break; case CD_TRACK_MODE2: case CD_TRACK_MODE2_FORM_MIX: size = 2336; break; case CD_TRACK_MODE2_FORM2: size = 2324; break; } dtrack->suboffset = size; dtrack->subcode = strack->subtype == CD_SUB_NONE ? 0 : strack->subtype == CD_SUB_RAW ? 1 : 2; dtrack->chdtrack = strack; dtrack->size = size; dtrack->enctype = ENC_CHD; dtrack->fname = my_strdup (zfile_getname (zcue)); dtrack->filesize = cf->logical_bytes (); dtrack->track = i + 1; dtrack[1].address = dtrack->address + strack->frames; if (cf->hunk_info(dtrack->offset * CD_FRAME_SIZE / hunksize, compr, cbytes) == CHDERR_NONE) { TCHAR tmp[100]; uae_u32 c = (uae_u32)compr; for (int j = 0; j < 4; j++) { uae_u8 b = c >> ((3 - j) * 8); if (c < 10) { b += '0'; } if (b < ' ' || b >= 127) b = '.'; tmp[j] = b; } tmp[4] = 0; dtrack->extrainfo = my_strdup (tmp); } }