function [D, SR] = audioread(FN, TARGETSR, FORCEMONO, START, END) % [D, SR] = audioread(FN, TARGETSR, FORCEMONO, START, END) % Read in an audio file, using wavread, mp3read, m4aread, or flacread2 as % appropriate. % 2010-09-16 Dan Ellis dpwe@ee.columbia.edu if nargin < 2; TARGETSR = []; end if nargin < 3; FORCEMONO = 0; end if nargin < 4; START = 0; end if nargin < 5; END = 0; end if length(TARGETSR) == 0 TARGETSR = 0; end [pth,nam,ext] = fileparts(FN); ext = lower(ext); if strcmp(ext,'.mp3') [SIZ,SR] = mp3read(FN,'size'); ch = min(FORCEMONO,SIZ(2)); ds = 1; if TARGETSR > 0 && SR > 2*TARGETSR ds = 2; if SR > 4*TARGETSR && SR >= 22050 % mpg123 will only do 4:1 downsampling for higher SRs ds = 4; end end [D,SR] = mp3read(FN,0,ch,ds); elseif strcmp(ext, '.m4a') || strcmp(ext, '.aac') || strcmp(ext, '.mp4') [SIZ,SR] = m4aread(FN,'size'); ch = min(FORCEMONO,SIZ(2)); ds = 1; % if TARGETSR > 0 && SR > 2*TARGETSR % ds = 2; % if SR > 4*TARGETSR % ds = 4; % end % end % downsampling really helps in mp3read, but not at present in m4aread [D,SR] = m4aread(FN,0,ch,ds); elseif strcmp(ext, '.flac') [D,SR] = flacread2(FN); elseif strcmp(ext, '.wv1') || strcmp(ext, '.wv2') ... || strcmp(ext, '.wvs') || strcmp(ext, '.shn') % nist sphere with shorten - wsj1 % use dpwelib as a mex file [D,SR] = ReadSound(FN); D = D'; % returns in rows! else [D,SR] = wavread(FN); end % always mono (if not handled in mp3read etc.) if FORCEMONO && size(D,2) == 2 D = mean(D,2); end % truncate before resampling if START > 0 || END > START if END < START; END = length(D)/SR; end EIX = min(length(D),round(END*SR)); D = D((round(START*SR)+1):EIX,:); end if TARGETSR > 0 && SR ~= TARGETSR [p,n,e] = fileparts(FN); disp(['*** audioread: resampling ',n,' from ', num2str(SR), ... ' to ', num2str(TARGETSR)]); D = resample(D, TARGETSR, SR); SR = TARGETSR; end