mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-10 23:11:01 +00:00
added libraries: opus flac libsndfile updated: libvorbis libogg openal - Everything works as expected for now. Bare in mind libsndfile needed the check for whether or not it could find the xiph libraries removed in order for this to work.
136 lines
3 KiB
C
136 lines
3 KiB
C
|
|
#include "sfconfig.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include <sndfile.h>
|
|
|
|
|
|
static void *
|
|
get_cues (const char *filename, double *sr)
|
|
{
|
|
SNDFILE *file;
|
|
SF_INFO sfinfo;
|
|
|
|
unsigned int err, size;
|
|
uint32_t count = 0;
|
|
SF_CUES_VAR(0) *info;
|
|
|
|
if ((file = sf_open(filename, SFM_READ, &sfinfo)) == NULL)
|
|
{
|
|
printf("can't open file '%s'\n", filename);
|
|
exit(1);
|
|
}
|
|
|
|
printf("\n---- get cues of file '%s'\n", filename);
|
|
|
|
if ((err = sf_command(file, SFC_GET_CUE_COUNT, &count, sizeof(uint32_t))) == SF_FALSE)
|
|
{
|
|
if (sf_error(file))
|
|
{
|
|
printf("can't get cue info size for file '%s' (arg size %lu), err %s\n",
|
|
filename, sizeof(uint32_t), sf_strerror(file));
|
|
exit(2);
|
|
}
|
|
else
|
|
printf("no cue info for file '%s'\n", filename);
|
|
return NULL;
|
|
}
|
|
|
|
size = sizeof(*info) + count * sizeof(SF_CUE_POINT);
|
|
printf("number of cues %d size %d\n", count, size);
|
|
|
|
if (!(info = malloc(size)))
|
|
return NULL;
|
|
|
|
if (sf_command(file, SFC_GET_CUE, info, size) == SF_FALSE)
|
|
{
|
|
printf("can't get cue info of size %d for file '%s' error %s\n",
|
|
size, filename, sf_strerror(file));
|
|
exit(3);
|
|
}
|
|
|
|
*sr = sfinfo.samplerate;
|
|
sf_close(file);
|
|
|
|
return info;
|
|
}
|
|
|
|
|
|
static void
|
|
test_cues (const char *filename)
|
|
{
|
|
unsigned int i;
|
|
double sr;
|
|
SF_CUES_VAR(0) *info = get_cues(filename, &sr);
|
|
|
|
if (info == NULL)
|
|
exit(1);
|
|
|
|
for (i = 0; i < info->cue_count; i++)
|
|
{
|
|
int pos = info->cue_points[i].position;
|
|
double t = (double) pos / sr;
|
|
double expected = i < 8 ? (double) i / 3. : 10. / 3.;
|
|
double error = (double) fabs(t - expected);
|
|
|
|
printf("cue %02d: markerID %02d position %6d offset %6d (time %.3f expected %.3f diff %f) label '%s'\n",
|
|
i, info->cue_points[i].indx, pos, info->cue_points[i].sample_offset, t, expected, error, info->cue_points[i].name);
|
|
|
|
if (error > 0.025)
|
|
exit(4);
|
|
}
|
|
|
|
free(info);
|
|
}
|
|
|
|
static void
|
|
print_cues (const char *filename)
|
|
{
|
|
unsigned int i;
|
|
double sr;
|
|
SF_CUES_VAR(0) *info = get_cues(filename, &sr);
|
|
|
|
if (info == NULL)
|
|
exit(1);
|
|
|
|
for (i = 0; i < info->cue_count; i++)
|
|
{
|
|
int pos = info->cue_points[i].position;
|
|
int indx = info->cue_points[i].indx;
|
|
int cstart = info->cue_points[i].chunk_start;
|
|
int bstart = info->cue_points[i].block_start;
|
|
int offset = info->cue_points[i].sample_offset;
|
|
const char *name = info->cue_points[i].name;
|
|
double t = (double) pos / sr;
|
|
|
|
if (cstart != 0 || bstart != 0)
|
|
printf("cue %02d time %7.3f: markerID %02d position %8d chunk_start %d block_start %d offset %8d label '%s'\n",
|
|
i, t, indx, pos, offset, cstart, bstart, name);
|
|
else
|
|
printf("cue %02d time %7.3f: markerID %02d position %8d offset %8d label '%s'\n",
|
|
i, t, indx, pos, offset, name);
|
|
}
|
|
|
|
free(info);
|
|
}
|
|
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
int i;
|
|
|
|
if (argc > 1)
|
|
for (i = 1; i < argc; i++)
|
|
print_cues(argv[i]);
|
|
else
|
|
{
|
|
test_cues("clickpluck24.wav");
|
|
test_cues("clickpluck.wav");
|
|
test_cues("clickpluck.aiff");
|
|
}
|
|
return 0;
|
|
}
|