function u=construct(s,sizes_in)
	src=construct(s.source);
	ch=channels(s.source);

	span=s.block;
	jump=s.hop;
	olap=span-jump;
	rdr=src.reader(jump);

	if olap>0
		buf=[zeros(ch,jump),sigreadn(src,olap)]; % preload with overlap
		OL1=1:olap;
		OL=(jump+1):span;
		HOP=(olap+1):span;
		process=@proc;
		fprintf('  Using signal reader with overlap=%d.\n',olap);
	else
		process=@proc0;
		fprintf('  Using zero-overlap signal reader.\n');
	end

	u=mkunit(s);
	u.starting  = src.start;
	u.stopping  = src.stop;
	u.dispose   = src.dispose;
	u.process   = process;
	u.sizes_out = {[ch,span]};

	function out=proc0, 
		[out,rem]=rdr();
		if rem>0, error('ARROW:EOF','End of stream'); end
	end

	function out=proc, 
		buf(:,OL1)=buf(:,OL); % copy overlap from end of buf to head
		[buf(:,HOP),rem]=rdr();
		if rem>0, error('ARROW:EOF','End of stream'); end
		%out=[buf,chunk];
		out=buf;
	end

	% old version
	function out=proc1, 
		[chunk,rem]=rdr();
		if rem>0, error('ARROW:EOF','End of stream'); end
		out=[buf,chunk];
		buf=out(:,OL);
	end
end
