annotate signals/transfer.m @ 13:03694e5c8365
Reorganised some high order list functions to correct class-based method dispatch; fixed some docs.
author |
samer |
date |
Wed, 16 Jan 2013 12:12:34 +0000 |
parents |
289445d368a7 |
children |
beb8a3f4a345 |
rev |
line source |
samer@1
|
1 % transfer - Transfer samples from a signal to a sink
|
samer@1
|
2 %
|
samer@1
|
3 % transfer :: signal(C,R), sink(C,R) -> action natural.
|
samer@1
|
4 %
|
samer@1
|
5 % Returns the number of samples transfered.
|
samer@1
|
6 function n=transfer(sig,sink,varargin)
|
samer@1
|
7 opts=prefs('chunk',512,varargin{:});
|
samer@1
|
8 chunk=uint32(opts.chunk);
|
samer@1
|
9
|
samer@1
|
10 u=construct(sink);
|
samer@1
|
11 try
|
samer@1
|
12 write=u.writer(chunk);
|
samer@1
|
13 s=construct(sig);
|
samer@1
|
14 try % to make sure we dispose of s once opened
|
samer@1
|
15 n=uint32(0); CHUNK=1:chunk;
|
samer@1
|
16 x=zeros(channels(sig),chunk); % buffer
|
samer@1
|
17 r=s.reader(opts.chunk);
|
samer@1
|
18 rem=0;
|
samer@1
|
19 s.start();
|
samer@1
|
20 u.start();
|
samer@1
|
21 while rem==0
|
samer@1
|
22 [x,rem]=r();
|
samer@1
|
23 if rem==0, rem=write(x);
|
samer@1
|
24 else rem=rem+write(x(:,1:end-rem));
|
samer@1
|
25 end
|
samer@1
|
26 n=n+(chunk-rem);
|
samer@1
|
27 end
|
samer@1
|
28 u.stop();
|
samer@1
|
29 s.stop();
|
samer@1
|
30 catch ex
|
samer@1
|
31 s.dispose();
|
samer@1
|
32 rethrow(ex);
|
samer@1
|
33 end
|
samer@1
|
34 catch ex
|
samer@1
|
35 u.dispose();
|
samer@1
|
36 rethrow(ex);
|
samer@1
|
37 end
|
samer@1
|
38
|
samer@1
|
39 s.dispose();
|
samer@1
|
40 u.dispose();
|
samer@1
|
41 end
|