diff --git a/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_metadata_addKey.m b/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_metadata_addKey.m index f8c22ff4d502e1a86903ac5e4e6475177ce90e39..430e46c9146d2c7706ff57585cd7536aa7c0f9c2 100644 --- a/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_metadata_addKey.m +++ b/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_metadata_addKey.m @@ -1,4 +1,4 @@ -function [ metadata ] = daffv15_metadata_addKey(metadata, keyname, datatype, value) +function [ metadata ] = daffv15_metadata_addKey( metadata_in, keyname, datatype, value) %DAFF_METADATA_ADDKEY Adds another key to a DAFF metadata struct % TODO: % ITAToolbox schauen @@ -9,42 +9,54 @@ function [ metadata ] = daffv15_metadata_addKey(metadata, keyname, datatype, val % You can find the license for this m-file in the application folder. % -% if (~isempty(metadata)) -% if (~isstruct(metadata)), error(['[' mfilename '] Wrong datatype for metadata']); end; -% else - metadata = struct('name', {}, 'datatype', {}, 'value', {}); -% end - - if (~ischar(keyname)), error(['[' mfilename '] Key name must be a string']); end; + if (~isempty(metadata_in)) + if (~isstruct(metadata_in)) + error( 'Input metadata is not empty and not a struct' ) + end; + metadata = metadata_in; + else + metadata = struct(); + end + + keyname(ismember(keyname,' ')) = '_'; + keyname(ismember(keyname,',.:;!')) = []; + + if (~ischar(keyname)) + error('Key %s name must be a string', keyname ) + end; % Keynames are case-insensitive (convert to upper case) keyname = upper(keyname); % Test wheather a key of the given name already exists - if any(strcmp({metadata(:).name}, keyname)) - error(['[' mfilename '] Key ''' keyname ''' already exists']); + if isfield( metadata, keyname ) + error(['Key ''' keyname ''' already exists']); end - if (~ischar(datatype)), error(['[' mfilename '] Datatype must be a string']); end; + if (~ischar(datatype)) + error(['Datatype must be a string']) + end switch (upper(datatype)) case 'BOOL' - if (~islogical(value)), error(['[' mfilename '] Value must be logical for boolean keys']); end; - metadata(end+1) = struct('name', keyname, 'datatype', 0, 'value', value); + if (~islogical(value)) + error(['[' mfilename '] Value must be logical for boolean keys']) + end; + metadata.(keyname) = boolean( value ); case 'INT' if (~isfinite(value)), error(['[' mfilename '] Value must be finite']); end; if (~isreal(value)), error(['[' mfilename '] Value must be real']); end; if (value ~= ceil(value)), error(['[' mfilename '] Value must be an integer number for integer keys']); end; - metadata(end+1) = struct('name', keyname, 'datatype', 1, 'value', int32(value)); + metadata.(keyname) = int32(value); case 'FLOAT' if (~isfinite(value)), error(['[' mfilename '] Value must be finite']); end; - if (~isreal(value)), error(['[' mfilename '] Value must be real']); end; - metadata(end+1) = struct('name', keyname, 'datatype', 2, 'value', double(value)); + if (~isreal(value)), error(['[' mfilename '] Value must be real']); end; + metadata.(keyname) = double(value); case 'STRING' - if (~ischar(value)), error(['[' mfilename '] Value must be a string for string keys']); end; - metadata(end+1) = struct('name', keyname, 'datatype', 3, 'value', value); + if (~ischar(value)), error(['[' mfilename '] Value must be a string for string keys']); end; + metadata.(keyname) = char(value); end end diff --git a/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_write_metadata.m b/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_write_metadata.m index 8d035adfff635f37d967005eec18c3e18b10cfc9..0232a0808626902b90ac5f5cb5942bd13db86e36 100644 --- a/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_write_metadata.m +++ b/applications/VirtualAcoustics/openDAFF/OpenDAFFv1.5/daffv15_write_metadata.m @@ -35,33 +35,42 @@ function [ ] = daffv15_write_metadata( fid, metadata ) % Logical scalar (DAFF_BOOL) if islogical(value) && isscalar(value) type = 'BOOL'; + datatype = 0; end % Integer scalar (DAFF_INT) if isinteger(value) && isfinite(value) && isreal(value) && isscalar(value) type = 'INT'; + datatype = 1; end % Floating point scalar (DAFF_FLOAT) if isfloat(value) && isfinite(value) && isreal(value) && isscalar(value) type = 'FLOAT'; + datatype = 2; end % String (DAFF_STRING) if ischar( value ) type = 'STRING'; + datatype = 3; end if isempty( type ) error( 'Unsupported datatype %s for key ''%s'' in metadata', class( value ), name ); end - metadata_new_format = daffv15_metadata_addKey( metadata_new_format, name, type, value ); + %metadata_new_format = daffv15_metadata_addKey( metadata_new_format, name, type, value ); + metadata_new_format(i).name = name; + metadata_new_format(i).datatype = datatype; + metadata_new_format(i).value = value; end metadata = metadata_new_format; end + nkeys = length( metadata ); + % Number of keys fwrite( fid, nkeys, 'int32' );