 061991fe60
			
		
	
	
		061991fe60
		
	
	
	
	
		
			
			it appears a one-character typo in the cmake_minimum_required line prevents it from compiling under CMake 4.0. in order to fix that, I had to take this thing out of submodules... it is recommended to do this after you pull; git submodule deinit extern/libsndfile
		
			
				
	
	
		
			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;
 | |
| }
 |