diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirfunction.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirfunction.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,207 @@
+function o = mirfunction(method,x,varg,nout,specif,init,main)
+% Meta function called by all MIRtoolbox functions.
+% Integrates the function into the general flowchart
+%   and eventually launches the "mireval" evaluation process.
+% Here are the successive steps in the following code:
+%   - If the input is an audio filename, instantiates a new design flowchart.
+%   - Reads all the options specified by the user.
+%   - Performs the 'init' part of the MIRtoolbox function:
+%       - If the input is a design flowchart,
+%           add the 'init' part in the flowchart.
+%       - If the input is some MIRtoolbox data,
+%           execute the 'init' part on that data.
+%   - Performs the 'main' part of the MIRtoolbox function.
+
+if isempty(x)
+    o = {{},{},{}};
+    return
+end
+
+if ischar(x) % The input is a file name.
+    % Starting point of the design process
+    design_init = 1;
+    filename = x;
+    if strcmpi(func2str(method),'miraudio')
+        postoption = {};
+    else
+        postoption.mono = 1;
+    end
+    orig = mirdesign(@miraudio,'Design',{varg},postoption,struct,'miraudio'); 
+    % Implicitly, the audio file needs to be loaded first.
+elseif isnumeric(x)
+    mirerror(func2str(method),'The input should be a file name or a MIRtoolbox object.');
+else
+    design_init = 0;
+    orig = x;
+end
+
+% Reads all the options specified by the user.
+[orig during after] = miroptions(method,orig,specif,varg);
+
+% Performs the 'init' part of the MIRtoolbox function.
+if isa(orig,'mirdesign')
+    if not(get(orig,'Eval'))
+        % Top-down construction of the general design flowchart
+        
+        if isstruct(during) && isfield(during,'frame') && ...
+                isstruct(during.frame) && during.frame.auto
+            % 'Frame' option: 
+            % Automatic insertion of the mirframe step in the design
+            orig = mirframe(orig,during.frame.length.val,...
+                                 during.frame.length.unit,...
+                                 during.frame.hop.val,...
+                                 during.frame.hop.unit);   
+        end
+        
+        % The 'init' part of the function can be integrated into the design
+        % flowchart. This leads to a top-down construction of the
+        % flowchart.
+        % Automatic development of the implicit prerequisites,
+        % with management of the data types throughout the design process.
+        [orig type] = init(orig,during);
+                
+        o = mirdesign(method,orig,during,after,specif,type);
+                    
+        if design_init && not(strcmpi(filename,'Design'))
+            % Now the design flowchart has been completed created.
+            % If the 'Design' keyword not used,
+            % the function is immediately evaluated
+            o = mireval(o,filename,nout);
+        else
+            o = returndesign(o,nout);
+        end
+        if not(iscell(o))
+            o = {o};
+        end
+        return
+    else
+        % During the top-down traversal of the flowchart (evaleach), at the
+        % beginning of the evaluation process.
+        
+        if not(isempty(get(orig,'TmpFile'))) && get(orig,'ChunkDecomposed')
+            orig = evaleach(orig);
+            if iscell(orig)
+                orig = orig{1};
+            end
+            x = orig;
+        else
+            [orig x] = evaleach(orig);
+        end
+        
+        if not(isequal(method,@nthoutput))
+            if iscell(orig)
+                orig = orig{1};
+            end
+            if isempty(get(orig,'InterChunk'))
+                orig = set(orig,'InterChunk',get(x,'InterChunk'));
+            end
+        end
+    end
+else
+    design = 0;
+    if iscell(orig)
+        i = 0;
+        while i<length(orig) && not(design)
+            i = i+1;
+            if isa(orig{i},'mirdesign')
+                design = i;
+            end
+        end
+    end
+    if design
+        % For function with multiple inputs
+        if design == 1 && not(get(orig{1},'Eval'))
+            % Progressive construction of the general design
+            [orig type] = init(orig,during);
+            o = mirdesign(method,orig,during,after,specif,type);
+            o = set(o,'Size',get(orig{1},'Size'));
+            o = returndesign(o,nout);
+            return
+        else
+            % Evaluation of the design.
+            % First top-down initiation (evaleach), then bottom-up process.
+            for io = 1:length(orig)
+                if isa(orig{io},'mirdesign')
+                    o = evaleach(orig{io});
+                    if iscell(o)
+                        o = o{:};
+                    end
+                    orig{io} = o;
+                end
+            end
+        end
+    elseif not(isempty(init)) && not(isempty(during))
+        if isstruct(during) && isfield(during,'frame') && ...
+                isstruct(during.frame) && during.frame.auto
+            orig = mirframe(orig,during.frame.length,during.frame.hop);        
+        end
+        % The input of the function is not a design flowchart, which
+        % the 'init' part of the function could be integrated into.
+            % (cf. previous call of 'init' in this script). 
+        % For that reason, the 'init' part of the function needs to be
+        % evaluated now.
+        orig = init(orig,during);
+    end
+end
+
+% Performs the 'main' part of the MIRtoolbox function.
+if not(iscell(orig) && not(ischar(orig{1}))) && ...
+        not(isa(orig,'mirdesign') || isa(orig,'mirdata'))
+    o = {orig};
+    return
+end
+filenamearg = orig;
+if iscell(filenamearg) && not(ischar(filenamearg{1}))
+    filenamearg = filenamearg{1};
+end
+if iscell(filenamearg) && not(ischar(filenamearg{1}))
+    filenamearg = filenamearg{1};
+end
+filename = get(filenamearg,'Name');
+if not(isempty(during)) && mirverbose
+%     if length(filename) == 1
+%         disp(['Computing ',func2str(method),' related to ',filename{1},'...'])
+%     else
+%         disp(['Computing ',func2str(method),' for all audio files ...'])
+%     end
+end
+if iscell(x)
+    x1 = x{1};
+else
+    x1 = x;
+end
+if not(iscell(orig) || isnumeric(x))
+    orig = set(orig,'Index',get(x1,'Index'));
+end
+if iscell(orig)
+    o = main(orig,during,after);
+else
+    d = get(orig,'Data');
+    if isamir(orig,'miraudio') && ...
+        length(d) == 1 && length(d{1}) == 1 && isempty(d{1}{1})
+        % To solve a problem when MP3read returns empty chunk.
+        % Warning: it should not be a cell, because for instance nthoutput can have first input empty... 
+        o = orig;
+    else
+        o = main(orig,during,after);
+    end
+end
+if not(iscell(o) && length(o)>1) || (isa(x,'mirdesign') && get(x,'Eval'))
+    o = {o x};
+elseif iscell(x) && isa(x{1},'mirdesign') && get(x{1},'Eval')
+    o = {o x{1}};
+elseif not(isempty(varg)) && isstruct(varg{1}) ...
+            && not(iscell(o) && iscell(o{1}))
+    % When the function was called by mireval, the output should be packed
+    % into one single cell array (in order to be send back to calling
+    % routines).
+    o = {o};
+end
+
+
+function o = returndesign(i,nout)
+o = cell(1,nout);
+o{1} = i;
+for k = 2:nout
+    o{k} = nthoutput(i,k);
+end
\ No newline at end of file