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
|