annotate Code/Descriptors/yin/private/sf_info.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents ea0c737c6323
children
rev   line source
dawn@0 1 function i = sf_info(i)
dawn@0 2 % i=sf_info(i) - extract useful info from file
dawn@0 3
dawn@0 4 % Alain de Cheveigné, CNRS/Ircam, 2002.
dawn@0 5 % Copyright (c) 2002 Centre National de la Recherche Scientifique.
dawn@0 6 %
dawn@0 7 % Permission to use, copy, modify, and distribute this software without
dawn@0 8 % fee is hereby granted FOR RESEARCH PURPOSES only, provided that this
dawn@0 9 % copyright notice appears in all copies and in all supporting
dawn@0 10 % documentation, and that the software is not redistributed for any
dawn@0 11 % fee (except for a nominal shipping charge).
dawn@0 12 %
dawn@0 13 % For any other uses of this software, in original or modified form,
dawn@0 14 % including but not limited to consulting, production or distribution
dawn@0 15 % in whole or in part, specific prior permission must be obtained from CNRS.
dawn@0 16 % Algorithms implemented by this software may be claimed by patents owned
dawn@0 17 % by CNRS, France Telecom, Ircam or others.
dawn@0 18 %
dawn@0 19 % The CNRS makes no representations about the suitability of this
dawn@0 20 % software for any purpose. It is provided "as is" without express
dawn@0 21 % or implied warranty. Beware of the bugs.
dawn@0 22
dawn@0 23 if ~nargin ; error('sf_info: no input arguement'); end
dawn@0 24 if ~isa(i, 'struct')
dawn@0 25 j.fname=i;
dawn@0 26 i=j;
dawn@0 27 i=sf_info(i);
dawn@0 28 return
dawn@0 29 end
dawn@0 30 if ~isfield(i, 'fname'); error('sf_info: no fname field'); end
dawn@0 31
dawn@0 32 % guess format only if unknown
dawn@0 33 if ~isfield(i, 'format') | isempty(i.format);
dawn@0 34 i = sf_format(i);
dawn@0 35 if ~strcmp(i.format, 'matrix') disp(i.format); end
dawn@0 36 end
dawn@0 37
dawn@0 38 % handle workspace matrices as if they were files
dawn@0 39 if strcmp(i.format, 'matrix')
dawn@0 40 [nrows, ncols] = size(i.fname);
dawn@0 41 i.nchans=ncols;
dawn@0 42 i.nsamples=nrows;
dawn@0 43 i.totalsamples = i.nsamples*i.nchans;
dawn@0 44 i.sr=[];
dawn@0 45 return;
dawn@0 46 end
dawn@0 47
dawn@0 48 % close file if open
dawn@0 49 if exist('i.fd') & fopen(i.fd)
dawn@0 50 fclose(i.fd);
dawn@0 51 end
dawn@0 52
dawn@0 53 % use standard matlab functions for AU and WAV and MACSND
dawn@0 54 if strcmp(i.format, 'AU')
dawn@0 55 if isempty(findstr('.', i.fname))
dawn@0 56 disp(['WARNING: matlab function AUREAD requires '...
dawn@0 57 '.au or .snd suffix on file name: ' i.fname]);
dawn@0 58 end
dawn@0 59 sz = auread(i.fname, 'size');
dawn@0 60 i.nsamples=sz(1);
dawn@0 61 i.nchans=sz(2);
dawn@0 62 i.totalsamples = i.nsamples*i.nchans;
dawn@0 63 [dummy, i.sr, i.samplebits] = auread(i.fname, 1);
dawn@0 64 return;
dawn@0 65 end
dawn@0 66 if strcmp(i.format, 'WAV')
dawn@0 67 if isempty(findstr('.wav', i.fname)) & isempty(findstr('.WAV', i.fname))
dawn@0 68 disp(['WARNING: matlab function WAVREAD requires '...
dawn@0 69 '.wav suffix on file name: ' i.fname]);
dawn@0 70 end
dawn@0 71 sz = wavread(i.fname, 'size');
dawn@0 72 i.nsamples=sz(1);
dawn@0 73 i.nchans=sz(2);
dawn@0 74 i.totalsamples = i.nsamples*i.nchans;
dawn@0 75 [dummy, i.sr, i.samplebits] = wavread(i.fname, 1);
dawn@0 76 return;
dawn@0 77 end
dawn@0 78 if strcmp(i.format, 'MACSND')
dawn@0 79 % must load the data to get info - this is stupid
dawn@0 80 if ~isempty(findstr(':', i.fname))
dawn@0 81 disp(['matlab function READSND cannot handle an '...
dawn@0 82 'indirect path: ' i.fname]);
dawn@0 83 end
dawn@0 84 if 3==exist('readsnd')
dawn@0 85 [data, i.sr] = eval('readsnd(i.fname)');
dawn@0 86 else
dawn@0 87 error('cannot read MACSND on this platform');
dawn@0 88 end
dawn@0 89 i.nsamples = size(data,2);
dawn@0 90 i.nchans = size(data,1);
dawn@0 91 i.totalsamples = i.nsamples*i.nchans;
dawn@0 92 return
dawn@0 93 end
dawn@0 94
dawn@0 95 % reopen file
dawn@0 96 if strcmp(i.format, 'ascii') ...
dawn@0 97 | strcmp(i.format, 'csv') | strcmp(i.format, '|WAVE')
dawn@0 98 [i.fd, msg] = fopen(i.fname, 'rt');
dawn@0 99 else
dawn@0 100 [i.fd, msg] = fopen(i.fname, 'r', 'ieee-be.l64');
dawn@0 101 end
dawn@0 102 if i.fd == -1
dawn@0 103 if isempty(msg)
dawn@0 104 error(['could not open: ', i.fname]);
dawn@0 105 else
dawn@0 106 error(msg)
dawn@0 107 end
dawn@0 108 end
dawn@0 109 fd = i.fd;
dawn@0 110 if ~isfield(i, 'nbytes')
dawn@0 111 if (-1 == fseek(i.fd, 0, 1)) ; error ('fseek failed'); end;
dawn@0 112 i.nbytes = ftell(i.fd);
dawn@0 113 end
dawn@0 114 fseek(fd, 0, -1); % rewind
dawn@0 115
dawn@0 116
dawn@0 117 switch i.format
dawn@0 118 %%%%%%%%%%%%%%%%%%% AIFF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 119 case {'AIFF','AIFC'}
dawn@0 120 fseek(fd, 12, 0); % skip container chunk
dawn@0 121 % skip over spurious chunks
dawn@0 122 idx=ftell(fd);
dawn@0 123 while 1
dawn@0 124 magic=char(fread(fd,4,'uchar'))';
dawn@0 125 if strcmp(magic,'COMM'); break; end;
dawn@0 126 idx = idx+1;
dawn@0 127 status = fseek(fd,idx,-1);
dawn@0 128 if status == -1
dawn@0 129 error('expected COMM magic word, found eof');
dawn@0 130 end;
dawn@0 131 end;
dawn@0 132
dawn@0 133 %ckSize=fread(fd,1,'int32');
dawn@0 134 %status = fseek(fd, ckSize, 0); % skip to end of chunk
dawn@0 135 %if status == -1
dawn@0 136 % error('unexpected eof');
dawn@0 137 %end
dawn@0 138
dawn@0 139 %while (1)
dawn@0 140 % magic = char(fread(fd, 4, 'char'))';
dawn@0 141 % if ~strcmp(magic, 'SSND')
dawn@0 142 % fseek(fd, -4, 0); % skip back
dawn@0 143 % break;
dawn@0 144 % end
dawn@0 145 % ckSize = fread(fd, 1, 'long');
dawn@0 146 % fseek(fd, ckSize, 0); % skip to end of sound chunk
dawn@0 147 %end
dawn@0 148 %magic = char(fread (fd, 4, 'char'))';
dawn@0 149 %if ~strcmp(magic, 'COMM'); error(['expected COMM, found ', magic]) ; end
dawn@0 150 commsz = fread(fd, 1, 'int32');
dawn@0 151 i.nchans = fread(fd, 1, 'int16');
dawn@0 152 i.nsamples = fread(fd, 1, 'uint32');
dawn@0 153 i.totalsamples = i.nsamples*i.nchans;
dawn@0 154 i.samplebits = fread(fd, 1, 'int16');
dawn@0 155 switch i.samplebits
dawn@0 156 case 16
dawn@0 157 i.sample_bytes = 2;
dawn@0 158 i.sample_type = 'int16';
dawn@0 159 case 32
dawn@0 160 i.sample_bytes = 4;
dawn@0 161 i.sample_type = 'int32'; % or float?
dawn@0 162 otherwise
dawn@0 163 error(['unexpected samplebits: ' num2str(i.samplebits) ]);
dawn@0 164 end
dawn@0 165 % read sampling rate using Hideki Kawahara's code:
dawn@0 166 srex1=fread(fd,1,'uint16');
dawn@0 167 srex2=fread(fd,1,'uint64');
dawn@0 168 if strcmp(char(i.format),'AIFC')
dawn@0 169 compress=fread(fd,4,'uchar');
dawn@0 170 if ~strcmp(char(compress),'NONE')
dawn@0 171 error('Compression is not supported.');
dawn@0 172 end;
dawn@0 173 fseek(fd, commsz-22, 0);
dawn@0 174 end;
dawn@0 175 i.sr = 2^(srex1-16383)*srex2/hex2dec('8000000000000000');
dawn@0 176 %fseek(fd, 12, -1); % skip back to end of container chunk
dawn@0 177 % skip over eventual common chunk
dawn@0 178 %while(1)
dawn@0 179 % magic = char(fread(fd, 4, 'char'))';
dawn@0 180 % if ~strcmp(magic, 'COMM')
dawn@0 181 % fseek(fd, -4, 0); % skip back
dawn@0 182 % break;
dawn@0 183 % end
dawn@0 184 % ckSize = fread(fd, 1, 'long');
dawn@0 185 % fseek(fd, ckSize, 0); % skip over chunk
dawn@0 186 %end
dawn@0 187 magic=char(fread(fd,4,'uchar'))';
dawn@0 188 while ~strcmp(char(magic),'SSND')
dawn@0 189 [ckSize, count]=fread(fd,1,'int32');
dawn@0 190 if ~count;
dawn@0 191 error('expected chunk size field, found eof');
dawn@0 192 return
dawn@0 193 end
dawn@0 194 status = fseek(fd, ckSize, 0); % skip to end of chunk
dawn@0 195 if status == -1
dawn@0 196 error('expected SSND magic word, found eof');
dawn@0 197 return
dawn@0 198 end;
dawn@0 199 magic=char(fread(fd,4,'uchar'))';
dawn@0 200 end;
dawn@0 201
dawn@0 202 %magic = char(fread(fd, 4, 'char'))';
dawn@0 203 %if ~strcmp(magic, 'SSND')
dawn@0 204 % error (['expected SSND, found' magic]);
dawn@0 205 %end
dawn@0 206 fseek(fd, 12, 0); % skip over ckSize, offset and blocksize fields
dawn@0 207 i.bytes_to_data = ftell(fd);
dawn@0 208 if i.totalsamples*i.sample_bytes ~= i.nbytes-i.bytes_to_data
dawn@0 209 disp(['WARNING: header fields sample_bytes: ' ...
dawn@0 210 num2str(i.sample_bytes)]);
dawn@0 211 disp (['and sample and channel count: ' num2str(i.nsamples) ...
dawn@0 212 ', ' num2str(i.nchans)]);
dawn@0 213 disp(['are inconsistent with offset to data: ' ...
dawn@0 214 num2str(i.bytes_to_data) ' and file size: ' ...
dawn@0 215 num2str(i.nbytes)]);
dawn@0 216 disp (['(' num2str(i.totalsamples*i.sample_bytes) ...
dawn@0 217 ' ~= ' num2str(i.nbytes-i.bytes_to_data) ')']);
dawn@0 218 end
dawn@0 219
dawn@0 220 return
dawn@0 221 %%%%%%%%%%%%%%%%%%% NIST %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 222 case 'NIST'
dawn@0 223 % fseek(fd, 0, -1);
dawn@0 224 % line = fscanf(fd, '%s' , 1);
dawn@0 225 % if ~strcmp(line, 'NIST_1A'); error(['expected NIST_1A, found ', magic]); end
dawn@0 226 fseek(fd, 8, 0); % skip over magic string
dawn@0 227 i.bytes_to_data = fscanf(fd, '%d', 1);
dawn@0 228 while (1)
dawn@0 229 key = fscanf(fd, '%s', 1);
dawn@0 230 if strcmp(key, 'end_head'); break; end;
dawn@0 231 % read third field according to spec in second field (type)
dawn@0 232 % this may need refining...
dawn@0 233 type = fscanf(fd, '%s', 1);
dawn@0 234 if strcmp(type(1:2), '-s')
dawn@0 235 bytes_to_read = sscanf(type(3:end), '%d', 1);
dawn@0 236 fseek(fd, 1, 0); % skip blank
dawn@0 237 value = char(fread(fd, bytes_to_read, 'char'))';
dawn@0 238 else
dawn@0 239 value = fscanf(fd, '%f', 1);
dawn@0 240 end
dawn@0 241 i = setfield(i, key, value);
dawn@0 242 end
dawn@0 243 % give standard names to useful fields
dawn@0 244 if isfield(i, 'channel_count'); i.nchans = i.channel_count; end
dawn@0 245 if isfield(i, 'sample_count'); i.nsamples = i.sample_count; end
dawn@0 246 i.totalsamples = i.nsamples*i.nchans;
dawn@0 247 if isfield(i, 'sample_rate');
dawn@0 248 i.sr = i.sample_rate;
dawn@0 249 i.xunits = 's';
dawn@0 250 end
dawn@0 251 if ~isfield(i, 'sample_coding'); i.sample_coding = 'pcm'; end
dawn@0 252 i.bytes_to_data = 1024; % needs checking
dawn@0 253 i.sample_bytes=2;
dawn@0 254 i.sample_type='int16';
dawn@0 255 return
dawn@0 256 %%%%%%%%%%%%%%%%%%% |WAVE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 257 case '|WAV'
dawn@0 258 line = fscanf(fd, '%s' , 1); % skip first line
dawn@0 259 i.nsamples = fscanf(fd, '%d', 1);
dawn@0 260 i.nchans = fscanf(fd, '%d', 1);
dawn@0 261 i.totalsamples = i.nsamples*i.nchans;
dawn@0 262 i.bytes_to_data = ftell(fd);
dawn@0 263 % channel info handled during data read
dawn@0 264 i.totalsamples = i.nsamples * i.nchans;
dawn@0 265 return
dawn@0 266 %%%%%%%%%%%%%%%%%%% WFF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 267 case 'wff'
dawn@0 268 fseek(fd, 4, 0); % skip magic number
dawn@0 269 i.version = fread(fd, 1, 'long');
dawn@0 270 i.type_code = fread(fd, 1, 'long');
dawn@0 271 i.nchans = fread(fd, 1, 'long');
dawn@0 272 i.info.channel_flags = fread(fd, 1, 'long');
dawn@0 273 i.bytes_to_data = fread(fd, 1, 'long');
dawn@0 274 fseek(fd, 40, 0);
dawn@0 275 i.gen_prog_name = fread(fd, 32, 'char');
dawn@0 276 i.comment = fread(fd, 32, 'char');
dawn@0 277 i.sample_bytes = 2;
dawn@0 278 i.sample_type = 'int16';
dawn@0 279 return;
dawn@0 280 % channel info handled later during channel read
dawn@0 281 %%%%%%%%%%%%%%%%%%% ESPS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 282 case 'ESPS'
dawn@0 283 % Based on Peter Kabal's afsp package.
dawn@0 284 % This handles at least one kind of ESPS waveform file. Others?
dawn@0 285 i.machine_code = fread(fd, 1, 'uint');
dawn@0 286 i.version_check_code = fread(fd, 1, 'uint');
dawn@0 287 i.bytes_to_data = fread(fd, 1, 'uint');
dawn@0 288 i.record_size = fread(fd, 1, 'uint');
dawn@0 289 fseek(fd, 20, -1);
dawn@0 290 i.EDR_ESPS_flag = fread(fd, 1, 'uint');
dawn@0 291 i.align_pad_size = fread(fd, 1, 'uint');
dawn@0 292 fseek(fd, 32, -1);
dawn@0 293 i.file_type = fread(fd, 1, 'uint16');
dawn@0 294 fseek(fd, 40, -1);
dawn@0 295 i.file_creation_date_time = char(fread(fd, 26, 'char'))';
dawn@0 296 i.header_version = char(fread(fd, 8, 'char'))';
dawn@0 297 i.program_name = char(fread(fd, 16, 'char'))';
dawn@0 298 i.program_version = char(fread(fd, 8, 'char'))';
dawn@0 299 i.compile_date = char(fread(fd, 26, 'char'))';
dawn@0 300 i.tag = fread(fd, 1, 'uint');
dawn@0 301 fseek(fd, 132, -1);
dawn@0 302 i.ndoubles = fread(fd, 1, 'uint');
dawn@0 303 i.nfloats = fread(fd, 1, 'uint');
dawn@0 304 i.nlongs = fread(fd, 1, 'uint');
dawn@0 305 i.nshorts = fread(fd, 1, 'uint');
dawn@0 306 i.nchars = fread(fd, 1, 'uint');
dawn@0 307 i.fixed_header_size = fread(fd, 1, 'uint');
dawn@0 308 i.var_header_size = fread(fd, 1, 'uint');
dawn@0 309 %w.dunno_what = fread(fd, 1, 'uint');
dawn@0 310 fseek(fd, 160, -1);
dawn@0 311 i.user = char(fread(fd, 8, 'char'))';
dawn@0 312 % scan the rest of the header to find sampling rate
dawn@0 313 a = ftell(fd);
dawn@0 314 bytes_left_in_header = i.bytes_to_data - ftell(fd);
dawn@0 315 hunk = char(fread(fd, bytes_left_in_header, 'uchar'))';
dawn@0 316 b = findstr(hunk, 'record_freq');
dawn@0 317 %fseek(fd, a+b-1, -1);
dawn@0 318 %w.xxxx = char(fread(fd, 12, 'char'))';
dawn@0 319 %w.count = fread(fd, 1, 'uint');
dawn@0 320 %w.data_code = fread(fd, 1, 'ushort');
dawn@0 321 fseek(fd, a+b-1+12+2+4, -1);
dawn@0 322 i.sr = fread(fd, 1, 'double');
dawn@0 323 i.nchans = i.ndoubles+i.nfloats+i.nlongs ...
dawn@0 324 +i.nshorts+i.nchars;
dawn@0 325 recordsize = i.ndoubles*8 + i.nfloats*4 + i.nlongs*4 ...
dawn@0 326 +i.nshorts*2+i.nchars;
dawn@0 327 i.nsamples = (i.nbytes - i.bytes_to_data) / recordsize;
dawn@0 328 i.totalsamples = i.nsamples * i.nchans;
dawn@0 329 i.sample_bytes = 2; % bug
dawn@0 330 i.sample_type = 'int16'; % bug
dawn@0 331 return;
dawn@0 332 %%%%%%%%%%%%% PLAIN ASCII %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 333 case 'ascii'
dawn@0 334 if isfield(i, 'bytes_to_data')
dawn@0 335 fseek(fd, i.bytes_to_data, 0);
dawn@0 336 else
dawn@0 337 i.bytes_to_data = 0;
dawn@0 338 end
dawn@0 339 line = fgetl(fd);
dawn@0 340 i.nchans = size(sscanf(line, '%f'), 1);
dawn@0 341 nlines = 1;
dawn@0 342 while (1)
dawn@0 343 line = fgets(i.fd);
dawn@0 344 if isa(line, 'double') & -1 == line; break; end
dawn@0 345 nlines = nlines+1;
dawn@0 346 end
dawn@0 347 i.nsamples = nlines;
dawn@0 348 i.totalsamples = i.nsamples*i.nchans;
dawn@0 349 i.sr=1;
dawn@0 350 return
dawn@0 351 %%%%%%%%%%%%% COMMA-SEPARATED VALUES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 352 case 'csv';
dawn@0 353 if isfield(i, 'bytes_to_data')
dawn@0 354 fseek(fd, i.bytes_to_data, 0);
dawn@0 355 else
dawn@0 356 i.bytes_to_data = 0;
dawn@0 357 end
dawn@0 358 % todo
dawn@0 359 return
dawn@0 360 %%%%%%%%%%%%% Binary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dawn@0 361 case {'uchar'}; % should take care of signed/unsigned
dawn@0 362 i.sample_bytes = 1;
dawn@0 363 i.sample_type = 'uchar';
dawn@0 364 if isfield(i, 'bytes_to_data')
dawn@0 365 fseek(fd, i.bytes_to_data, 0);
dawn@0 366 else
dawn@0 367 i.bytes_to_data = 0;
dawn@0 368 end
dawn@0 369 if ~isfield(i, 'nchans')
dawn@0 370 i.nchans = 1;
dawn@0 371 end
dawn@0 372 i.nsamples = (i.nbytes-i.bytes_to_data)/i.sample_bytes;
dawn@0 373 i.totalsamples = i.nsamples * i.nchans;
dawn@0 374 i.sr=1;
dawn@0 375 return
dawn@0 376 case {'short', 'int16'};
dawn@0 377 i.sample_bytes = 2;
dawn@0 378 i.sample_type = 'int16';
dawn@0 379 if isfield(i, 'bytes_to_data')
dawn@0 380 fseek(fd, i.bytes_to_data, 0);
dawn@0 381 else
dawn@0 382 i.bytes_to_data = 0;
dawn@0 383 end
dawn@0 384 if ~isfield(i, 'nchans')
dawn@0 385 i.nchans = 1;
dawn@0 386 end
dawn@0 387 i.nsamples = (i.nbytes-i.bytes_to_data)/i.sample_bytes;
dawn@0 388 i.totalsamples = i.nsamples * i.nchans;
dawn@0 389 i.sr=1;
dawn@0 390 return
dawn@0 391 case {'long', 'int32'};
dawn@0 392 i.sample_bytes = 4;
dawn@0 393 i.sample_type = 'int32';
dawn@0 394 if isfield(i, 'bytes_to_data')
dawn@0 395 fseek(fd, i.bytes_to_data, 0);
dawn@0 396 else
dawn@0 397 i.bytes_to_data = 0;
dawn@0 398 end
dawn@0 399 if ~isfield(i, 'nchans')
dawn@0 400 i.nchans = 1;
dawn@0 401 end
dawn@0 402 i.nsamples = (i.nbytes-i.bytes_to_data)/i.sample_bytes;
dawn@0 403 i.totalsamples = i.nsamples * i.nchans;
dawn@0 404 i.sr=1;
dawn@0 405 return
dawn@0 406 case {'float', 'float32'};
dawn@0 407 i.sample_bytes = 4;
dawn@0 408 i.sample_type = 'float32';
dawn@0 409 if isfield(i, 'bytes_to_data')
dawn@0 410 fseek(fd, i.bytes_to_data, 0);
dawn@0 411 else
dawn@0 412 i.bytes_to_data = 0;
dawn@0 413 end
dawn@0 414 if ~isfield(i, 'nchans')
dawn@0 415 i.nchans = 1;
dawn@0 416 end
dawn@0 417 i.nsamples = (i.nbytes-i.bytes_to_data)/i.sample_bytes;
dawn@0 418 i.totalsamples = i.nsamples * i.nchans;
dawn@0 419 i.sr=1;
dawn@0 420 return
dawn@0 421 case {'double', 'float64'};
dawn@0 422 i.sample_bytes = 8;
dawn@0 423 i.sample_type = 'float64';
dawn@0 424 if isfield(i, 'bytes_to_data')
dawn@0 425 fseek(fd, i.bytes_to_data, 0);
dawn@0 426 else
dawn@0 427 i.bytes_to_data = 0;
dawn@0 428 end
dawn@0 429 if ~isfield(i, 'nchans')
dawn@0 430 i.nchans = 1;
dawn@0 431 end
dawn@0 432 i.nsamples = (i.nbytes-i.bytes_to_data)/i.sample_bytes;
dawn@0 433 i.totalsamples = i.nsamples * i.nchans;
dawn@0 434 i.sr=1;
dawn@0 435 return
dawn@0 436 otherwise
dawn@0 437 error(['unknown format: >' i.format '<']);
dawn@0 438 end