annotate aim-mat/tools/getAIFFinfo.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
tomwalters@0 1 % tool
tomwalters@0 2 %
tomwalters@0 3 % INPUT VALUES:
tomwalters@0 4 %
tomwalters@0 5 % RETURN VALUE:
tomwalters@0 6 %
tomwalters@0 7 %
bleeck@3 8 % (c) 2011, University of Southampton
bleeck@3 9 % Maintained by Stefan Bleeck (bleeck@gmail.com)
bleeck@3 10 % download of current version is on the soundsoftware site:
bleeck@3 11 % http://code.soundsoftware.ac.uk/projects/aimmat
bleeck@3 12 % documentation and everything is on http://www.acousticscale.org
bleeck@3 13
tomwalters@0 14
tomwalters@0 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%
tomwalters@0 16 %
tomwalters@0 17 % File: GetAIFFinfo.m
tomwalters@0 18 % by stefan@bleeck.de
tomwalters@0 19 %%%%%%%%%%%%%%%%%%%%%%%%%%%
tomwalters@0 20
tomwalters@0 21 function ret = GetAIFFinfo(fname)
tomwalters@0 22
tomwalters@0 23 [fid, msg] = fopen(fname);
tomwalters@0 24 if fid == -1
tomwalters@0 25 error('File open error. Please check that the file name is correctly spelled.')
tomwalters@0 26 end
tomwalters@0 27 littleEndian = 0;
tomwalters@0 28 aiff_form = ReadBytes(fid, 4, littleEndian);
tomwalters@0 29 if aiff_form' == double('FORM')
tomwalters@0 30 % disp('big-endian');
tomwalters@0 31 else
tomwalters@0 32 % disp('little-endian');
tomwalters@0 33 littleEndian = 1;
tomwalters@0 34 end;
tomwalters@0 35
tomwalters@0 36 chunkSize = Read32Bits(fid, littleEndian);
tomwalters@0 37
tomwalters@0 38 aiff_aiff = ReadBytes(fid, 4, littleEndian);
tomwalters@0 39 if aiff_aiff' ~= double('AIFF')
tomwalters@0 40 aiff_aiff
tomwalters@0 41 disp('Not a valid AIFF file.');
tomwalters@0 42 return
tomwalters@0 43 end;
tomwalters@0 44 chunkSize = chunkSize - 16;
tomwalters@0 45
tomwalters@0 46 while chunkSize - 4 > 0;
tomwalters@0 47 chunkName = ReadBytes(fid, 4, littleEndian);
tomwalters@0 48 chunkSize = chunkSize - 4;
tomwalters@0 49 if chunkName' == double('COMM');
tomwalters@0 50 % disp('step COMM');
tomwalters@0 51 subSize = Read32Bits(fid, littleEndian);
tomwalters@0 52 chunkSize = chunkSize-subSize;
tomwalters@0 53 numChannels = Read16Bits(fid, littleEndian);
tomwalters@0 54 subSize = subSize - 2;
tomwalters@0 55 numSampleFrames = Read32Bits(fid, littleEndian);
tomwalters@0 56 subSize = subSize - 4;
tomwalters@0 57 sampleSize = Read16Bits(fid, littleEndian);
tomwalters@0 58 subSize = subSize - 2;
tomwalters@0 59 sampleRate = ReadIEEE2(fid, littleEndian);
tomwalters@0 60 subSize = subSize - 10;
tomwalters@0 61 fread(fid, subSize, 'char');
tomwalters@0 62 elseif chunkName' == double('SSND');
tomwalters@0 63 % disp('step SSND');
tomwalters@0 64 subSize = Read32Bits(fid, littleEndian);
tomwalters@0 65 chunkSize = chunkSize - subSize;
tomwalters@0 66 offset = Read32Bits(fid, littleEndian);
tomwalters@0 67 subSize = subSize - 4;
tomwalters@0 68 blockSize = Read32Bits(fid, littleEndian);
tomwalters@0 69 subSize = subSize - 4;
tomwalters@0 70 soundPosition = ftell(fid) + offset;
tomwalters@0 71 fread(fid, subSize, 'char');
tomwalters@0 72 elseif chunkName' == double('LUT2');
tomwalters@0 73 % disp('step LUT2');
tomwalters@0 74 subSize = Read32Bits(fid, littleEndian);
tomwalters@0 75 chunkSize = chunkSize - subSize;
tomwalters@0 76 interleaveLevel = Read16Bits(fid, littleEndian);
tomwalters@0 77 subSize = subSize - 2;
tomwalters@0 78 numWindowFrames = Read16Bits(fid, littleEndian);
tomwalters@0 79 subSize = subSize - 2;
tomwalters@0 80 staticTimeFlag = Read16Bits(fid, littleEndian);
tomwalters@0 81 subSize = subSize - 2;
tomwalters@0 82 outputTimeOffset = ReadIEEE2(fid, littleEndian);
tomwalters@0 83 subSize = subSize - 10;
tomwalters@0 84 absoluteNormalise = ReadIEEE2(fid, littleEndian);
tomwalters@0 85
tomwalters@0 86 subSize = subSize - 10;
tomwalters@0 87 fread(fid, subSize, 'char');
tomwalters@0 88
tomwalters@0 89 else;
tomwalters@0 90 subSize = Read32Bits(fid, littleEndian);
tomwalters@0 91 chunkSize = chunkSize - subSize;
tomwalters@0 92 fread(fid, subSize, 'char');
tomwalters@0 93
tomwalters@0 94 end;
tomwalters@0 95 end;
tomwalters@0 96 fclose(fid);
tomwalters@0 97
tomwalters@0 98 wordSize = floor((sampleSize + 7 ) / 8);
tomwalters@0 99 normalise = (2^16 - 1) / 2^(17 - wordSize * 8) / absoluteNormalise;
tomwalters@0 100 switch wordSize
tomwalters@0 101 case 1, scale = normalise / 127.0;
tomwalters@0 102 case 2, scale = normalise / 32768.0;
tomwalters@0 103 case 4, scale = normalise / 32768.0 / 65536;
tomwalters@0 104 end
tomwalters@0 105 frameLength = numSampleFrames / numWindowFrames;
tomwalters@0 106
tomwalters@0 107 ret.totalframetime=frameLength/sampleRate;
tomwalters@0 108 ret.numWindowFrames=numWindowFrames;
tomwalters@0 109 ret.scale=scale;
tomwalters@0 110 ret.wordSize=wordSize;
tomwalters@0 111 ret.soundPosition=soundPosition;
tomwalters@0 112 ret.littleEndian=littleEndian;
tomwalters@0 113 ret.frameLength=frameLength;
tomwalters@0 114 ret.numChannels=numChannels;
tomwalters@0 115 ret.numSampleFrames=numSampleFrames;
tomwalters@0 116 ret.sampleSize=sampleSize;
tomwalters@0 117 ret.sampleRate=sampleRate;
tomwalters@0 118 ret.interleaveLevel=interleaveLevel;
tomwalters@0 119 ret.numWindowFrames=numWindowFrames;
tomwalters@0 120 ret.staticTimeFlag=staticTimeFlag;
tomwalters@0 121 ret.outputTimeOffset=outputTimeOffset;
tomwalters@0 122 ret.absoluteNormalise=absoluteNormalise;