diff options
author | yenatch <yenatch@gmail.com> | 2017-01-08 16:06:19 -0500 |
---|---|---|
committer | yenatch <yenatch@gmail.com> | 2017-01-08 16:06:19 -0500 |
commit | 10e5474a65d2ff356e1a6280568c078fee1c9b52 (patch) | |
tree | 8aea2e5e3bbf9f5a9e05e640071a4a7c67e9a4dc /tools/aif2pcm/main.c | |
parent | d8aee3a4a5fb66622fe44abb561b3bb49b4a93e5 (diff) |
aif2pcm: Fix length reporting. Don't use a MARK chunk if no loop.
The reported sample length in the aif header can differ from the actual
length of the SSND chunk. The END marker was being misused to contain
the reported length, but this still counts as a loop in aif2agb, even
if the START marker is omitted (it defaults to the END value).
Now the reported length is in the COMM chunk, which is more correct.
Diffstat (limited to 'tools/aif2pcm/main.c')
-rw-r--r-- | tools/aif2pcm/main.c | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/tools/aif2pcm/main.c b/tools/aif2pcm/main.c index be83554a2..a2c3bcd5c 100644 --- a/tools/aif2pcm/main.c +++ b/tools/aif2pcm/main.c @@ -55,6 +55,7 @@ typedef struct { bool has_loop; unsigned long loop_offset; double sample_rate; + unsigned long real_num_samples; } AifData; struct Bytes { @@ -245,6 +246,10 @@ void read_aif(struct Bytes *aif, AifData *aif_data) } else if (strcmp(marker_name, "END") == 0) { + if (!aif_data->has_loop) { + aif_data->loop_offset = marker_position; + aif_data->has_loop = true; + } aif_data->num_samples = marker_position; } @@ -270,6 +275,7 @@ void read_aif(struct Bytes *aif, AifData *aif_data) memcpy(sample_data, &aif->data[pos], num_samples); aif_data->samples = sample_data; + aif_data->real_num_samples = num_samples; pos += chunk_size - 8; } else @@ -514,7 +520,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress) { struct Bytes *input = malloc(sizeof(struct Bytes)); input->data = aif_data.samples; - input->length = aif_data.num_samples; + input->length = aif_data.real_num_samples; pcm = delta_compress(input); free(input); } @@ -522,7 +528,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress) { pcm = malloc(sizeof(struct Bytes)); pcm->data = aif_data.samples; - pcm->length = aif_data.num_samples; + pcm->length = aif_data.real_num_samples; } output.length = header_size + pcm->length; output.data = malloc(output.length); @@ -588,7 +594,7 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n memcpy(aif_data->samples, pcm->data, pcm->length); struct Bytes *aif = malloc(sizeof(struct Bytes)); - aif->length = 54 + 60 + aif_data->num_samples; + aif->length = 54 + 60 + pcm->length; aif->data = malloc(aif->length); long pos = 0; @@ -632,10 +638,10 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n aif->data[pos++] = 1; // 1 channel // Common Chunk numSampleFrames - aif->data[pos++] = ((pcm->length >> 24) & 0xFF); - aif->data[pos++] = ((pcm->length >> 16) & 0xFF); - aif->data[pos++] = ((pcm->length >> 8) & 0xFF); - aif->data[pos++] = (pcm->length & 0xFF); + aif->data[pos++] = ((aif_data->num_samples >> 24) & 0xFF); + aif->data[pos++] = ((aif_data->num_samples >> 16) & 0xFF); + aif->data[pos++] = ((aif_data->num_samples >> 8) & 0xFF); + aif->data[pos++] = (aif_data->num_samples & 0xFF); // Common Chunk sampleSize aif->data[pos++] = 0; @@ -650,24 +656,25 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n aif->data[pos++] = sample_rate_buffer[i]; } - // Marker Chunk ckID - aif->data[pos++] = 'M'; - aif->data[pos++] = 'A'; - aif->data[pos++] = 'R'; - aif->data[pos++] = 'K'; + if (aif_data->has_loop) + { - // Marker Chunk ckSize - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 12 + (aif_data->has_loop ? 12 : 0); + // Marker Chunk ckID + aif->data[pos++] = 'M'; + aif->data[pos++] = 'A'; + aif->data[pos++] = 'R'; + aif->data[pos++] = 'K'; - // Marker Chunk numMarkers - aif->data[pos++] = 0; - aif->data[pos++] = (aif_data->has_loop ? 2 : 1); + // Marker Chunk ckSize + aif->data[pos++] = 0; + aif->data[pos++] = 0; + aif->data[pos++] = 0; + aif->data[pos++] = 12 + (aif_data->has_loop ? 12 : 0); + + // Marker Chunk numMarkers + aif->data[pos++] = 0; + aif->data[pos++] = (aif_data->has_loop ? 2 : 1); - if (aif_data->has_loop) - { // Marker loop start aif->data[pos++] = 0; aif->data[pos++] = 1; // id = 1 @@ -684,22 +691,22 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n aif->data[pos++] = 'A'; aif->data[pos++] = 'R'; aif->data[pos++] = 'T'; // markerName - } - // Marker loop end - aif->data[pos++] = 0; - aif->data[pos++] = (aif_data->has_loop ? 2 : 1); // id = 2 - - long loop_end = aif_data->num_samples; - aif->data[pos++] = ((loop_end >> 24) & 0xFF); - aif->data[pos++] = ((loop_end >> 16) & 0xFF); - aif->data[pos++] = ((loop_end >> 8) & 0xFF); - aif->data[pos++] = (loop_end & 0xFF); // position - - aif->data[pos++] = 3; // pascal-style string length - aif->data[pos++] = 'E'; - aif->data[pos++] = 'N'; - aif->data[pos++] = 'D'; + // Marker loop end + aif->data[pos++] = 0; + aif->data[pos++] = (aif_data->has_loop ? 2 : 1); // id = 2 + + long loop_end = aif_data->num_samples; + aif->data[pos++] = ((loop_end >> 24) & 0xFF); + aif->data[pos++] = ((loop_end >> 16) & 0xFF); + aif->data[pos++] = ((loop_end >> 8) & 0xFF); + aif->data[pos++] = (loop_end & 0xFF); // position + + aif->data[pos++] = 3; // pascal-style string length + aif->data[pos++] = 'E'; + aif->data[pos++] = 'N'; + aif->data[pos++] = 'D'; + } // Instrument Chunk ckID aif->data[pos++] = 'I'; |