summaryrefslogtreecommitdiff
path: root/tools/aif2pcm/main.c
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2017-01-08 16:06:19 -0500
committeryenatch <yenatch@gmail.com>2017-01-08 16:06:19 -0500
commit10e5474a65d2ff356e1a6280568c078fee1c9b52 (patch)
tree8aea2e5e3bbf9f5a9e05e640071a4a7c67e9a4dc /tools/aif2pcm/main.c
parentd8aee3a4a5fb66622fe44abb561b3bb49b4a93e5 (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.c81
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';