diff --git a/README.md b/README.md index 5fa245f..b964b6f 100644 --- a/README.md +++ b/README.md @@ -80,17 +80,16 @@ Notes: [.vag header](https://psx-spx.consoledev.net/cdromfileformats/#cdrom-file-audio-single-samples-vag-sony) at the beginning of the file. The header is always 48 bytes long for `vag` files, while in the case of `vagi` files it is padded to the size specified - using the `-a` option (2048 bytes by default). - -- The `vagi` format extends the standard .vag header by changing the signature - to `VAGi` and adding the following fields: + using the `-a` option (2048 bytes by default). The `vagi` format extends the + standard .vag header by adding the following fields: - the file's interleave size at offset `0x08-0x0B` (little endian); - the loop start offset in bytes-per-channel, if any, at offset `0x14-0x17` (little endian); - the file's channel count at offset `0x1E`. -- The `spu`, `vag`, `spui` and `vagi` formats support setting a loop start - point. If the input file is either a .wav file with sampler metadata (`smpl` +- The `spu` and `vag` formats support encoding a loop point as part of the ADPCM + data, while `vagi` supports storing one in the header for use by the stream + driver. If the input file is either a .wav file with sampler metadata (`smpl` chunk) or in a format FFmpeg supports parsing cue/chapter markers from, the first marker will be used as the loop point by default. The `-l` and `-n` options can be used to manually set a loop point or ignore the one present in diff --git a/psxavenc/filefmt.c b/psxavenc/filefmt.c index a4d96e1..b625590 100644 --- a/psxavenc/filefmt.c +++ b/psxavenc/filefmt.c @@ -307,6 +307,8 @@ void encode_file_spui(const args_t *args, decoder_t *decoder, FILE *output) { if (args->format == FORMAT_VAGI) fseek(output, header_size, SEEK_SET); + else if (args->audio_loop_point >= 0 && !(args->flags & FLAG_QUIET)) + fprintf(stderr, "Warning: ignoring loop point as there is no header to store it in\n"); int audio_state_size = sizeof(psx_audio_encoder_channel_state_t) * args->audio_channels; psx_audio_encoder_channel_state_t *audio_state = malloc(audio_state_size); @@ -342,12 +344,15 @@ void encode_file_spui(const args_t *args, decoder_t *decoder, FILE *output) { if (length > 0) { uint8_t *last_block = chunk_ptr + length - PSX_AUDIO_SPU_BLOCK_SIZE; - if (args->flags & FLAG_SPU_ENABLE_LOOP) { + if ( + (args->flags & FLAG_SPU_ENABLE_LOOP) || + (decoder->end_of_input && args->audio_loop_point >= 0) + ) { last_block[1] = PSX_AUDIO_SPU_LOOP_REPEAT; } else if (decoder->end_of_input) { // HACK: the trailing block should in theory be appended to // the existing data, but it's easier to just zerofill and - // repurpose the last encoded block + // repurpose the last encoded block. memset(last_block, 0, PSX_AUDIO_SPU_BLOCK_SIZE); last_block[1] = PSX_AUDIO_SPU_LOOP_TRAP; }