static int pt3_load(struct module_data *m, HIO_HANDLE *f, const int start) { iff_handle handle; char buf[20]; int ret; LOAD_INIT(); hio_read32b(f); /* FORM */ hio_read32b(f); /* size */ hio_read32b(f); /* MODL */ hio_read32b(f); /* VERS */ hio_read32b(f); /* VERS size */ hio_read(buf, 1, 10, f); libxmp_set_type(m, "%-6.6s IFFMODL", buf + 4); handle = libxmp_iff_new(); if (handle == NULL) return -1; /* IFF chunk IDs */ ret = libxmp_iff_register(handle, "INFO", get_info); ret |= libxmp_iff_register(handle, "CMNT", get_cmnt); ret |= libxmp_iff_register(handle, "PTDT", get_ptdt); if (ret != 0) return -1; libxmp_iff_set_quirk(handle, IFF_FULL_CHUNK_SIZE); /* Load IFF chunks */ if (libxmp_iff_load(handle, m, f, NULL) < 0) { libxmp_iff_release(handle); return -1; } libxmp_iff_release(handle); /* Sanity check */ if (m->mod.smp <= 0) { return -1; } return 0; }
static int gal5_load(struct module_data *m, HIO_HANDLE *f, const int start) { struct xmp_module *mod = &m->mod; iff_handle handle; int i, ret, offset; struct local_data data; LOAD_INIT(); hio_read32b(f); /* Skip RIFF */ hio_read32b(f); /* Skip size */ hio_read32b(f); /* Skip AM */ offset = hio_tell(f); mod->smp = mod->ins = 0; handle = libxmp_iff_new(); if (handle == NULL) return -1; m->c4rate = C4_NTSC_RATE; /* IFF chunk IDs */ ret = libxmp_iff_register(handle, "INIT", get_init); /* Galaxy 5.0 */ ret |= libxmp_iff_register(handle, "ORDR", get_ordr); ret |= libxmp_iff_register(handle, "PATT", get_patt_cnt); ret |= libxmp_iff_register(handle, "INST", get_inst_cnt); if (ret != 0) return -1; libxmp_iff_set_quirk(handle, IFF_LITTLE_ENDIAN); libxmp_iff_set_quirk(handle, IFF_SKIP_EMBEDDED); libxmp_iff_set_quirk(handle, IFF_CHUNK_ALIGN2); /* Load IFF chunks */ if (libxmp_iff_load(handle, m, f, &data) < 0) { libxmp_iff_release(handle); return -1; } libxmp_iff_release(handle); mod->trk = mod->pat * mod->chn; mod->smp = mod->ins; MODULE_INFO(); if (libxmp_init_instrument(m) < 0) return -1; if (libxmp_init_pattern(mod) < 0) return -1; D_(D_INFO "Stored patterns: %d", mod->pat); D_(D_INFO "Stored samples: %d ", mod->smp); hio_seek(f, start + offset, SEEK_SET); handle = libxmp_iff_new(); if (handle == NULL) return -1; /* IFF chunk IDs */ ret = libxmp_iff_register(handle, "PATT", get_patt); ret |= libxmp_iff_register(handle, "INST", get_inst); if (ret != 0) return -1; libxmp_iff_set_quirk(handle, IFF_LITTLE_ENDIAN); libxmp_iff_set_quirk(handle, IFF_SKIP_EMBEDDED); libxmp_iff_set_quirk(handle, IFF_CHUNK_ALIGN2); /* Load IFF chunks */ if (libxmp_iff_load(handle, m, f, &data) < 0) { libxmp_iff_release(handle); return -1; } libxmp_iff_release(handle); /* Alloc missing patterns */ for (i = 0; i < mod->pat; i++) { if (mod->xxp[i] == NULL) { if (libxmp_alloc_pattern_tracks(mod, i, 64) < 0) { return -1; } } } for (i = 0; i < mod->chn; i++) { mod->xxc[i].pan = data.chn_pan[i] * 2; } m->quirk |= QUIRKS_FT2; m->read_event_type = READ_EVENT_FT2; return 0; }