status Track::copyMarkers(TrackSetup *setup) { if ((markerCount = setup->markerCount) == 0) { markers = NULL; return AF_SUCCEED; } markers = _af_marker_new(markerCount); if (!markers) return AF_FAIL; for (int i=0; i<markerCount; i++) { markers[i].id = setup->markers[i].id; markers[i].name = _af_strdup(setup->markers[i].name); if (!markers[i].name) return AF_FAIL; markers[i].comment = _af_strdup(setup->markers[i].comment); if (!markers[i].comment) return AF_FAIL; markers[i].position = 0; } return AF_SUCCEED; }
/* Parse marker chunks, which contain the positions and names of loop markers. */ static status ParseMARK (AFfilehandle file, AFvirtualfile *fh, u_int32_t type, size_t size) { _Track *track; int i; u_int16_t numMarkers; assert(!memcmp(&type, "MARK", 4)); track = _af_filehandle_get_track(file, AF_DEFAULT_TRACK); af_fread(&numMarkers, sizeof (u_int16_t), 1, fh); numMarkers = BENDIAN_TO_HOST_INT16(numMarkers); track->markerCount = numMarkers; if (numMarkers) track->markers = _af_marker_new(numMarkers); for (i=0; i<numMarkers; i++) { u_int16_t markerID = 0; u_int32_t markerPosition = 0; u_int8_t sizeByte = 0; char *markerName = NULL; af_fread(&markerID, sizeof (u_int16_t), 1, fh); markerID = BENDIAN_TO_HOST_INT16(markerID); af_fread(&markerPosition, sizeof (u_int32_t), 1, fh); markerPosition = BENDIAN_TO_HOST_INT32(markerPosition); af_fread(&sizeByte, sizeof (unsigned char), 1, fh); markerName = _af_malloc(sizeByte + 1); af_fread(markerName, sizeof (unsigned char), sizeByte, fh); markerName[sizeByte] = '\0'; #ifdef DEBUG printf("marker id: %d, position: %d, name: %s\n", markerID, markerPosition, markerName); printf("size byte: %d\n", sizeByte); #endif /* If sizeByte is even, then 1+sizeByte (the length of the string) is odd. Skip an extra byte to make it even. */ if ((sizeByte % 2) == 0) af_fseek(fh, 1, SEEK_CUR); track->markers[i].id = markerID; track->markers[i].position = markerPosition; track->markers[i].name = markerName; track->markers[i].comment = _af_strdup(""); } return AF_SUCCEED; }
status WAVEFile::parseCues(const Tag &id, uint32_t size) { Track *track = getTrack(); uint32_t markerCount; readU32(&markerCount); track->markerCount = markerCount; if (markerCount == 0) { track->markers = NULL; return AF_SUCCEED; } if ((track->markers = _af_marker_new(markerCount)) == NULL) return AF_FAIL; for (unsigned i=0; i<markerCount; i++) { uint32_t id, position, chunkid; uint32_t chunkByteOffset, blockByteOffset; uint32_t sampleFrameOffset; Marker *marker = &track->markers[i]; readU32(&id); readU32(&position); readU32(&chunkid); readU32(&chunkByteOffset); readU32(&blockByteOffset); /* sampleFrameOffset represents the position of the mark in units of frames. */ readU32(&sampleFrameOffset); marker->id = id; marker->position = sampleFrameOffset; marker->name = _af_strdup(""); marker->comment = _af_strdup(""); } return AF_SUCCEED; }