123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #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;
- }
|