annotate src/libsndfile-1.0.25/tests/virtual_io_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include "sfconfig.h"
Chris@0 20
Chris@0 21 #include <stdio.h>
Chris@0 22 #include <stdlib.h>
Chris@0 23
Chris@0 24 #include <fcntl.h>
Chris@0 25 #include <math.h>
Chris@0 26 #include <string.h>
Chris@0 27 #include <errno.h>
Chris@0 28 #include <sys/stat.h>
Chris@0 29
Chris@0 30 #include <sndfile.h>
Chris@0 31
Chris@0 32 #include "utils.h"
Chris@0 33
Chris@0 34 static void vio_test (const char *fname, int format) ;
Chris@0 35
Chris@0 36 int
Chris@0 37 main (void)
Chris@0 38 {
Chris@0 39 vio_test ("vio_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@0 40 vio_test ("vio_pcm24.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ;
Chris@0 41 vio_test ("vio_float.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ;
Chris@0 42 vio_test ("vio_pcm24.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_24) ;
Chris@0 43
Chris@0 44 return 0 ;
Chris@0 45 } /* main */
Chris@0 46
Chris@0 47 /*==============================================================================
Chris@0 48 */
Chris@0 49
Chris@0 50 typedef struct
Chris@0 51 { sf_count_t offset, length ;
Chris@0 52 unsigned char data [16 * 1024] ;
Chris@0 53 } VIO_DATA ;
Chris@0 54
Chris@0 55 static sf_count_t
Chris@0 56 vfget_filelen (void *user_data)
Chris@0 57 { VIO_DATA *vf = (VIO_DATA *) user_data ;
Chris@0 58
Chris@0 59 return vf->length ;
Chris@0 60 } /* vfget_filelen */
Chris@0 61
Chris@0 62 static sf_count_t
Chris@0 63 vfseek (sf_count_t offset, int whence, void *user_data)
Chris@0 64 { VIO_DATA *vf = (VIO_DATA *) user_data ;
Chris@0 65
Chris@0 66 switch (whence)
Chris@0 67 { case SEEK_SET :
Chris@0 68 vf->offset = offset ;
Chris@0 69 break ;
Chris@0 70
Chris@0 71 case SEEK_CUR :
Chris@0 72 vf->offset = vf->offset + offset ;
Chris@0 73 break ;
Chris@0 74
Chris@0 75 case SEEK_END :
Chris@0 76 vf->offset = vf->length + offset ;
Chris@0 77 break ;
Chris@0 78 default :
Chris@0 79 break ;
Chris@0 80 } ;
Chris@0 81
Chris@0 82 return vf->offset ;
Chris@0 83 } /* vfseek */
Chris@0 84
Chris@0 85 static sf_count_t
Chris@0 86 vfread (void *ptr, sf_count_t count, void *user_data)
Chris@0 87 { VIO_DATA *vf = (VIO_DATA *) user_data ;
Chris@0 88
Chris@0 89 /*
Chris@0 90 ** This will brack badly for files over 2Gig in length, but
Chris@0 91 ** is sufficient for testing.
Chris@0 92 */
Chris@0 93 if (vf->offset + count > vf->length)
Chris@0 94 count = vf->length - vf->offset ;
Chris@0 95
Chris@0 96 memcpy (ptr, vf->data + vf->offset, count) ;
Chris@0 97 vf->offset += count ;
Chris@0 98
Chris@0 99 return count ;
Chris@0 100 } /* vfread */
Chris@0 101
Chris@0 102 static sf_count_t
Chris@0 103 vfwrite (const void *ptr, sf_count_t count, void *user_data)
Chris@0 104 { VIO_DATA *vf = (VIO_DATA *) user_data ;
Chris@0 105
Chris@0 106 /*
Chris@0 107 ** This will break badly for files over 2Gig in length, but
Chris@0 108 ** is sufficient for testing.
Chris@0 109 */
Chris@0 110 if (vf->offset >= SIGNED_SIZEOF (vf->data))
Chris@0 111 return 0 ;
Chris@0 112
Chris@0 113 if (vf->offset + count > SIGNED_SIZEOF (vf->data))
Chris@0 114 count = sizeof (vf->data) - vf->offset ;
Chris@0 115
Chris@0 116 memcpy (vf->data + vf->offset, ptr, (size_t) count) ;
Chris@0 117 vf->offset += count ;
Chris@0 118
Chris@0 119 if (vf->offset > vf->length)
Chris@0 120 vf->length = vf->offset ;
Chris@0 121
Chris@0 122 return count ;
Chris@0 123 } /* vfwrite */
Chris@0 124
Chris@0 125 static sf_count_t
Chris@0 126 vftell (void *user_data)
Chris@0 127 { VIO_DATA *vf = (VIO_DATA *) user_data ;
Chris@0 128
Chris@0 129 return vf->offset ;
Chris@0 130 } /* vftell */
Chris@0 131
Chris@0 132
Chris@0 133 /*==============================================================================
Chris@0 134 */
Chris@0 135
Chris@0 136 static void
Chris@0 137 gen_short_data (short * data, int len, int start)
Chris@0 138 { int k ;
Chris@0 139
Chris@0 140 for (k = 0 ; k < len ; k++)
Chris@0 141 data [k] = start + k ;
Chris@0 142 } /* gen_short_data */
Chris@0 143
Chris@0 144
Chris@0 145 static void
Chris@0 146 check_short_data (short * data, int len, int start, int line)
Chris@0 147 { int k ;
Chris@0 148
Chris@0 149 for (k = 0 ; k < len ; k++)
Chris@0 150 if (data [k] != start + k)
Chris@0 151 { printf ("\n\nLine %d : data [%d] = %d (should be %d).\n\n", line, k, data [k], start + k) ;
Chris@0 152 exit (1) ;
Chris@0 153 } ;
Chris@0 154 } /* gen_short_data */
Chris@0 155
Chris@0 156 /*------------------------------------------------------------------------------
Chris@0 157 */
Chris@0 158
Chris@0 159 static void
Chris@0 160 vio_test (const char *fname, int format)
Chris@0 161 { static VIO_DATA vio_data ;
Chris@0 162 static short data [256] ;
Chris@0 163
Chris@0 164 SF_VIRTUAL_IO vio ;
Chris@0 165 SNDFILE * file ;
Chris@0 166 SF_INFO sfinfo ;
Chris@0 167
Chris@0 168 print_test_name ("virtual i/o test", fname) ;
Chris@0 169
Chris@0 170 /* Set up pointers to the locally defined functions. */
Chris@0 171 vio.get_filelen = vfget_filelen ;
Chris@0 172 vio.seek = vfseek ;
Chris@0 173 vio.read = vfread ;
Chris@0 174 vio.write = vfwrite ;
Chris@0 175 vio.tell = vftell ;
Chris@0 176
Chris@0 177 /* Set virtual file offset and length to zero. */
Chris@0 178 vio_data.offset = 0 ;
Chris@0 179 vio_data.length = 0 ;
Chris@0 180
Chris@0 181 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 182 sfinfo.format = format ;
Chris@0 183 sfinfo.channels = 2 ;
Chris@0 184 sfinfo.samplerate = 44100 ;
Chris@0 185
Chris@0 186 if ((file = sf_open_virtual (&vio, SFM_WRITE, &sfinfo, &vio_data)) == NULL)
Chris@0 187 { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ;
Chris@0 188 fflush (stdout) ;
Chris@0 189 puts (sf_strerror (NULL)) ;
Chris@0 190 exit (1) ;
Chris@0 191 } ;
Chris@0 192
Chris@0 193 if (vfget_filelen (&vio_data) < 0)
Chris@0 194 { printf ("\n\nLine %d : vfget_filelen returned negative length.\n\n", __LINE__) ;
Chris@0 195 exit (1) ;
Chris@0 196 } ;
Chris@0 197
Chris@0 198 gen_short_data (data, ARRAY_LEN (data), 0) ;
Chris@0 199 sf_write_short (file, data, ARRAY_LEN (data)) ;
Chris@0 200
Chris@0 201 gen_short_data (data, ARRAY_LEN (data), 1) ;
Chris@0 202 sf_write_short (file, data, ARRAY_LEN (data)) ;
Chris@0 203
Chris@0 204 gen_short_data (data, ARRAY_LEN (data), 2) ;
Chris@0 205 sf_write_short (file, data, ARRAY_LEN (data)) ;
Chris@0 206
Chris@0 207 sf_close (file) ;
Chris@0 208
Chris@0 209 /* Now test read. */
Chris@0 210 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 211
Chris@0 212 vio_data.offset = 0 ;
Chris@0 213
Chris@0 214 if ((file = sf_open_virtual (&vio, SFM_READ, &sfinfo, &vio_data)) == NULL)
Chris@0 215 { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ;
Chris@0 216 fflush (stdout) ;
Chris@0 217 puts (sf_strerror (NULL)) ;
Chris@0 218
Chris@0 219 dump_data_to_file (fname, vio_data.data, vio_data.length) ;
Chris@0 220 exit (1) ;
Chris@0 221 } ;
Chris@0 222
Chris@0 223
Chris@0 224 sf_read_short (file, data, ARRAY_LEN (data)) ;
Chris@0 225 check_short_data (data, ARRAY_LEN (data), 0, __LINE__) ;
Chris@0 226
Chris@0 227 sf_read_short (file, data, ARRAY_LEN (data)) ;
Chris@0 228 check_short_data (data, ARRAY_LEN (data), 1, __LINE__) ;
Chris@0 229
Chris@0 230 sf_read_short (file, data, ARRAY_LEN (data)) ;
Chris@0 231 check_short_data (data, ARRAY_LEN (data), 2, __LINE__) ;
Chris@0 232
Chris@0 233 sf_close (file) ;
Chris@0 234
Chris@0 235 puts ("ok") ;
Chris@0 236 } /* vio_test */
Chris@0 237