function ltfatplay(source,varargin)
%LTFATPLAY Play data samples or a wav file
% Usage: ltfatplay('file.wav')
% ltfatplay(data,'fs',fs)
% ltfatplay(...,'devid',devid)
%
%
% LTFATPLAY('file.wav') plays a wav file using the default sound device.
%
% LTFATPLAY('file.wav','devid',devid) plays a wav file using the sound
% device with id devid. A list of available devices can be obtained by
% BLOCKDEVICES.
%
% LTFATPLAY(data,'fs',fs,...) works entirely similar, but data is
% expected to be a vector of length L or a LxW matrix with
% columns as individual channels and fs to be a sampling rate to be used.
% When no sampling rate is specified, 44.1 kHz is used.
%
% In addition, individual channels of the output sound device can be
% selected by using an additional key-value pair
%
% 'playch',playch
% A vector of channel indexes starting at 1.
%
% This function has the advantage over sound and soundsc that one can
% directly specify output device chosen from BLOCKDEVICES. Similar
% behavior can be achieved using audioplayer and audiodevinfo but
% only in Matlab. Audioplayer is not yet supported in Octave.
%
%
% Url: http://ltfat.github.io/doc/blockproc/ltfatplay.html
% Copyright (C) 2005-2023 Peter L. Soendergaard <peter@sonderport.dk> and others.
% This file is part of LTFAT version 2.6.0
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
% Author: Zdenek Prusa
% Initialize block stream
block(source,varargin{:});
sourceHandle = block_interface('getSource');
% Allow playing data and wav files only
if ~isa(sourceHandle,'function_handle')
error('%s: Specified source cannot be played.',upper(mfilename));
end
% Make the vector safe
Ls = block_interface('getLs');
Lssafe = max([256,Ls(1)]);
f = postpad(sourceHandle(1,Ls(1)),Lssafe);
% If one channel is used, broadcast it to all output channels
chanList = block_interface('getPlayChanList');
if size(f,2)==1
f = repmat(f,1,numel(chanList));
end
% Finally play it at once
playrec('play',f,chanList);