From e9823a113b28e33924bc23b08e1a34a80ffec8ee Mon Sep 17 00:00:00 2001 From: wang <wang@wang-OptiPlex-7010.(none)> Date: Wed, 9 Oct 2013 01:35:17 +0200 Subject: [PATCH] Fix bugs during installation of libsndfile-ocaml. New installation tested in Ubuntu 12.04. --- INSTALL.txt | 1 + examples/fft/fft.png | Bin 22515 -> 0 bytes .../lib/src/libsndfile-ocaml/sndfile.h | 666 ++++++++++++++++++ .../lib/src/libsndfile-ocaml/sndfile_stub.c | 2 +- 4 files changed, 668 insertions(+), 1 deletion(-) delete mode 100644 examples/fft/fft.png create mode 100644 interpreter/lib/src/libsndfile-ocaml/sndfile.h diff --git a/INSTALL.txt b/INSTALL.txt index ebfb17d..915253e 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -6,6 +6,7 @@ PREREQUISITES ------------- * OCaml is needed (tested versions: 3.12.1, 4.00.1). +* Faust is needed (tested version: 0.9.24). * The GNU C compiler gcc is recommended. * Standard development utilities are required, such as `make' (install XCode command line tools on Mac OS). diff --git a/examples/fft/fft.png b/examples/fft/fft.png deleted file mode 100644 index eec0f4b92371b1003ada7db3c283416928934e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22515 zcmeIac{tTy`#*}dY!sUeCBxpvijYiY+{h47G^hxrlsQB)Ya=p~c_@*jkRh2xW-^s2 zL&{iYvCYo?-s<x_&+mJ#^SjPD*ZJ!_*XO!EuGU`fweEG_Yu)#2z3%({_CKqwwwH#D zhK!7CuZFscE*Tjrhm33&0Zjod^7KY;;Lq;snrbR!+sJ=U%hDsr$gpG@D){sF6Q%|{ zURzx-`8I#=lgy<?k>SJi3+EFK<aCNFzPyp@eMs!|joq1tyEL93d&{AG<yf32zj&-x z67{Ww_OoXa@^5MhbgKB@;RtG<^V?|4_#}Ofzm5FN^vZSi(@n~&?G!Y`e*3WyO|Izm z89B4*vQL8+Z}Jq9E56+=bE<LbZd^+$TONGA>dFZM?oYZqLk@pK{jezb*C9Nbj7;>b zH-?PN_$dlUMpmgvtwcuV>BUHZPP_Qf(0BJ~46JZZ<bNOdf2F0Wgqh-BSwmaXLt8aQ z8#Q{`Cq_3GTPvV3m_z2>A}#!XdB&+?{glXq_B-i`%VSa%tLsDC?pe=3`@hV@lUwaW zOx_R9`AW%dt^DXVuy1KH+FF=(n{`Rv`kmf-Vm!fRwv70@Q->aBX>DD;_9a{1ajNHx z)PO_ZopiU~&$%{BD%MLXHkvAA#}n-B=-J80^r<5HckRzt*!rQcm1eY-_GA0Od<|>G zFT>fjJcaeVq1D78YMkqgeR2tL&}FuC@snV7sTjew_hxjW$JQ#>_DY??yuXg=!DD1( zIjZajTJD(b^~E3(5-?k1He0vWjVd-qMJj%$i40_Yz*IF|Th5g#pARxx>xf?C;DLwU zp-k}QOK)s^Fv7(XDbpTh+gs}*@4tB`8rcr}uyV>h_&u($?d<yjcA<qDChB{b8t3Yq zpTb7trSgStkIn9o?S>Bzshr$f;Q!-`tItE^<8FAuCN929Z^GcdoR@59-y)$SzdABq zIOP7V((B`_BaCaU5OqtzEa7f#_C{ki?-mpHfPJgn){wAYMR3Z>uS0$nkC8tC6~Xez z4<QO$E8Ze2ejY1+>oX<Uh4Xs|*yh>E^yICep_L$)nWFKml9>lJg4gbDw9<3RuJqgp znciqr<8pHlXG?S*i+x-%eAz5<X(`*I?D4aXsxTh4VD=N?E=;mbMr!9a?nPD)oq|71 zHSn)@$?rdypAd`dJ>Dw27+<j(KeX0WXk9Y>4wm~wX1kM;)xdUplQ_E(0g@p0kXapx zSSM*R31y<)Ir+QL{a4}4`yavCuA_p{*B(q}ZNmuVOI}o*E45PPZ#T2)W#=k6ocibA z6_&jrnjkx?A*?;Yo#^C2d~CGwy`cNr`dl^r_G<F>>M~dPcjoLK`Bz(6PG!Hw;%(f= zWrmzP&qyUc_?f}AIic1n{UeaxZ9@67-ySlu*Yx<9&cce#X-w78!hXA^qlN6-)xSVB zoyl7cXp<W^epnc-_bqiBd2B9qD=ao2k2Z2&eN#C2U}bLDvYL{Ntm`qh`Oc(X_$S!O ztzf&&J-fj{u@V1IoR95Z4%z#nM9lq9&f|&EE@;`h|Dnn$yAsj3*72gc$^ecNb|dv+ zJVk1-i!x24zfxZMuUGr8@BeSW`+pYY^XD6MRNZ>FH<E|H4$a&@L`HUM?V-Y>wOnYa z-lyXr%hWT(OC)>Qp-g|utv5o)xBcahXJlkdlRa-=inxq~i6%Nimt<^ekXe%dTJD>p zfI#+~-*CTUk@@3U<rWHOWofPI77Jiww<boH60d$R3p{|(^6$=bM*Qf8Cgq#AZ&(O6 z-x6FGBlBGPL4&)1A>=a@*<Jod=J|n<a2}88@P&u<g%)CI^I|s{Pf#oMJu)Z~vJIW6 zQ=n7Wx;ujxJwLQ@YlcB_)Bu-C;~gsbeHNEri4UmQ`ZedVZG-$?I1uH6I(q`I&MbQ~ zQu2F9;Dg3PsiOY%hwMaXr_^@D^2V&0FouO;2`b*9N6;_{ebrmNhEPRJIMOzcpO7## z<wf7&S-5lT>Qxi@S$FZAaun_WwUYYCAE7;b&SI2k@an4G7)H5GhtJW}N(+pHd>r~2 zmv?9&3dd{bLmJuElxYozZcxW4af3vlq4!GYO$-4>$F+~$`k#;W_3v3+UASq036FN7 zXj65?JO~s^&C$g2;L-lyiJDOl#9&}#)hONfN~GDXq6bZT9k0RzV3+zQO`~{qUebgq z_4I8#6?;x{!$RcI1Ip;bJ4+DfRGW?-v&XAzgZ@;X_hfo_V|39<VvK~)iAt}R9r0Qy z+>YkId4hhB#RLe+eLaG#&t%lweW&Yn$$f;+A1nlJS2t2_&P_n%)0R89r|)YYjmUlc zXWoF)FBoKIWsH&nOuM@Dkm)Oaf(AFbZ)cF6u!t}t1$7)c!^Z`E2N}bb9(TZ5iY@gv z6Cv0vB218QLT=^TL#~xdD&ex<9T7V6&f;tkxD@(Ujch75m)jQ;?{!^{RV|Lk65N}| z9jQl5GyJ+>SFmJZ#vFc6w6}U}EoQqfWs1PlB{Rhqt=UDZWAUwW#Qtdy`N`CX2kZmf zGw!?fU7{Y4#K1OB<~9ktOg!^bLMLyG2oPzjGP8<*R?&(~IT<uvE+XqnO5@c1NcD`~ zsJ;o}Ztahk+uO+yPFGzAmyFroYLbzL8m7S&U<hd?8w*W3a!a2(wPmK`EV5RI={;gx zq+4_C$X^$(%350L|9n<9DK3fT88V{hxNDkkAmTbqJG8w;teCl%Ewl7luVQ^*cF=XP zCEC!j7i6}FP}{G(C@thE!Rm2$S5Jf>;j<DZ>Q}g?aM4J(=DY3HpPAX^3yp%=@4pA= zxc$`QTJNc2*`}W@U!OT>Q+oFUYl73DbN4kDtHz$!24ug^V3bm(HJBF3i><!gMPh#Y zb2V1i51YiHp|8fi%9x8k0Q78<P^#;=jAq5ch3p4k0RNoi2z)|oTt+$xCbXK_`VM6^ z9Q;H~m+8sG;KuuE1%H0!1;b*6x*bjqtY#Z+{=CHHI`^TwbWEbCHZS5&m(LRg`#4(^ zRf7Y^03cV)`G^oOGiAg<OqEsPfa65lvuZ#3isgdry|~iRqc+YBn%C?A;U>GUO*##^ z5zXWmV*%k2A98INkKz3=C|qUnK0@frcHSdXo7eXsfW*S$7su@Vx_J+`q4hylrT1$; zGb<LJWD_u8)>l_;%9aq+v`<I&F6fq6IxfexTCYaOaWc~Cy$o8(bBP~~3)4_J3g9fF z!SutyahvzUz6Y(}KWm*=iEAwrr7~`5xwV`ds)Es_C1N^a3@Ix6@}hlIz+v2|=1rmS z4y_fkC9}{0MNf(+ID~7cP@-@_)JmQO0)Ga^1-0Dr#u&HsHi0eZ+sbsj7pRrk^8Rcj zQ^s?&c=a1!X%lox$+}|7gm?oIR2H502R%4|nNr4d^mJX6wyivPp1dm-d{$V*ZAn@x zy5C~h9zSgAF+tYKKG4P?J4P#yPjuk8*z#cK$<asp!im0uR$_y5dZR*`%%X)^3EV}7 zkDFW&X^WFwBGSR09!DDD_Q|~hiO|FIU!&GDE1Bcacber0JIk9EIDXX4CJ)Oiv;Kh1 z-jvCB8ny?Mhfmx1)W|4nXsv4`WzI6<5=|qKkr&UgkVaMq#lZt4!N9wrkaHtG#<`=Q zb0fUDZ@6VZ0rHI$`YzyQof{ARM+ehMYNgz~?DW5Dy?v6I@EIbA{)P#W6t~*;!l>`w zRhcp_-SiGE1?8X0GRTXKNFyr%S9e?T@tP^P*~GmvL8k_l-<MSusiV(=n?<~{0Q!#5 zLjA-tg%qcVM>z{wn!l?ecc?n_#-_ei)oD3tTS?VSw$xj`c}Kogj!xgnJ9G-hmpCbQ z1Wj&k8bPxu+Fh@W$iiGTuaBWP-@wnjHoWx7bR5*dJ&Wt#62qh4w2X5$sYoKRC@TyG zK1Kvz`A*@&fslc^Q@bTI+UV_rNTU|}*~+pI+QM}%)Yro}49;^j#XRUcuP2$6bdLHt zlDztaUy-UK+z6k_2MsFU7NLD(rIXTL&&$0l{yga?*p2<lq_v61JHKG~jVG<;*es3! z{v6qo4Ipj|&+|5VJQ^`pFKihwCB!cBt|YK57~+}?Ip_v4IiiMR*@>QiAN>R_9Ckw+ zeFWNgnnU5-=q?9427)+?hmWo7yJ#O6uCh<2+=!7d0ue!IfwO9w)_*y-Ee?x9TxKq8 zwIHzW?`mX2wYvKwi!SoR?99FIg6Vkup&*H3C2$vQaXJ?eKb(YgX}M)0er4+>h~+=U zxYNphAWe`(T79Jc5S&FLZkbEy$pA_^#uHA7x8><Q*3yfp$a6xw9l{a?3Hjn|KC7<n zz2{()7~r(>iw<o4%(kPaFn-png$a*^4*9>w6yZm$6qWdR6Z_*tEE%`{Pl)6l9UV`a zuCXve$WzBq6yz9j^WfDr!|;gKSI_f>VNvEL83H`u6LdG2l|W67!4-?0!p}JHXmHtp zFjCXfqPJuvXc?)iRJ<`SeKr~4fL^&$Y}ay2y9CdOkNLM@Igjiz+(&@JahA5#08oIs zCam{w%Q_zf?R<bF4reg@j0DA_Q_=MxUwF5+VmHc!`=9yvK!~jWm@I%A5sb-O6hKH! zt35phw#sXl$;lQuw6A%B3)$x*{AhuFc=U7;gB0}W>8Y1Pd!n;Q!t>ET@yd!-@qf`N zdY5i@y}5Y6$ydg(UJ%V2Q+$h&&&~%^e^Z|R`8jlZ^p?;P0;DuBO5LDGZ}>sdWto4j zUZP)DN0qL#4OD3%N&Dk1NbFL_b>v5FIBe(8rg=&OjIKP4sHthQ{;@PZ^_hgufit{l zF9Q^gnSqdR>h+Mc9?^mO8~tz2D$3&3PxUK<5d^#MPtoA=M>s*VqKQTdw*l}mz&P_} z__F<MeGH&Ulam$hZNb=7?%=?V@F%pzWA(SW@iCut>8G{Qy+h3bRcT%np6Ih=QRT6J zBL}}^bLHn1F!M)XxH+o|TMT%Rl|qlY+as#|Q81jQTz=kS{Y%zPJ!#S}Pi?;@w>3>N zMLoEkJ}E~S{Hmqu9U3*o=(%8JNthHTV$E-5_&Lg+_YFWRT>(Ha`n3lgA74au?l_FZ zgU)z_P3040Ju8pz`DDpb`vW7i)D{Ke!Wgd&6jxCuGG~anmBL58+xE61=cz%M{7^F1 zQVkI1rJaXEswo-;&|hO)z~?d$&a1$VctVTxsRL&(o=Btg3cPniBW0wG7z4oyt)!m6 z$@v-MmeRPhHULG9<1{8R;B%)FRF18u&G)<uutedG_VSU9E?!>)3-OvC^B-H(Rzt1B z{xgjxi)>}CLYl?=Un0`evLn(5L&*C7q#;iG3^!>B6jYHqn0Gt?rMoW1XepshWUq<& zt3G#EMdT7co~%$}7o=(;*(As2=>vM(SrF~AW?n3oR{^hnJg+y8mYt+h`012($`7O6 za1!I*+L6O1n+C-|+=KNT0BbOSH9nP1ImEe$pM6%3b(jlaL@UMhB2iRAkq-vX`lJ6h zaxE)|Xh97mi@?4_;ac>IJg)?*dgt(w!W@h({-gfTS)XaEt_~^Bw*ot@Zwu0qiF{gG za^8lyV7?$R3PRd>2=#$3Xs;vaDkhN9%F3sKmyk1(;Ehd1d57MDEx{})l{^sC?hT<^ zMxfpD-9{7QCyvkHP_Mqxn9#uJa5PR?PT#2wJNJ~PGXrahV3HqPPid84o7|~wq&)wD znKXFIxQRFojvLKU$}LmzP@L!QtQT*}I@06P_JQ2bg`U!Qi~3**%yF&6O�#-6^; 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	ds(sa0WZX$d7yd(AB&ao<gMTXgL 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 diff --git a/interpreter/lib/src/libsndfile-ocaml/sndfile.h b/interpreter/lib/src/libsndfile-ocaml/sndfile.h new file mode 100644 index 0000000..d0b26de --- /dev/null +++ b/interpreter/lib/src/libsndfile-ocaml/sndfile.h @@ -0,0 +1,666 @@ +/* +** Copyright (C) 1999-2011Erik de Castro Lopo <erikd@mega-nerd.com> +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* +** sndfile.h -- system-wide definitions +** +** API documentation is in the doc/ directory of the source code tarball +** and at http://www.mega-nerd.com/libsndfile/api.html. +*/ + +#ifndef SNDFILE_H +#define SNDFILE_H + +/* This is the version 1.0.X header file. */ +#define SNDFILE_1 + +#include <stdio.h> +#include <sys/types.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* The following file types can be read and written. +** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise +** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and +** SF_FORMAT_SUBMASK can be used to separate the major and minor file +** types. +*/ + +enum +{ /* Major formats. */ + SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ + SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ + SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ + SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ + SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ + SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ + SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ + SF_FORMAT_VOC = 0x080000, /* VOC files. */ + SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ + SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ + SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ + SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ + SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ + SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ + SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ + SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ + SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ + SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ + SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ + SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ + SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ + SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ + SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ + SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ + SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ + + /* Subtypes from here on. */ + + SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ + SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ + SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ + SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ + + SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ + + SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ + SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ + + SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ + SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ + SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ + SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ + + SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ + SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ + + SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ + SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ + SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ + + SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ + + SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ + SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ + + SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ + + /* Endian-ness options. */ + + SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ + SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ + SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ + SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ + + SF_FORMAT_SUBMASK = 0x0000FFFF, + SF_FORMAT_TYPEMASK = 0x0FFF0000, + SF_FORMAT_ENDMASK = 0x30000000 +} ; + +/* +** The following are the valid command numbers for the sf_command() +** interface. The use of these commands is documented in the file +** command.html in the doc directory of the source code distribution. +*/ + +enum +{ SFC_GET_LIB_VERSION = 0x1000, + SFC_GET_LOG_INFO = 0x1001, + SFC_GET_CURRENT_SF_INFO = 0x1002, + + + SFC_GET_NORM_DOUBLE = 0x1010, + SFC_GET_NORM_FLOAT = 0x1011, + SFC_SET_NORM_DOUBLE = 0x1012, + SFC_SET_NORM_FLOAT = 0x1013, + SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, + SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, + + SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, + SFC_GET_SIMPLE_FORMAT = 0x1021, + + SFC_GET_FORMAT_INFO = 0x1028, + + SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, + SFC_GET_FORMAT_MAJOR = 0x1031, + SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, + SFC_GET_FORMAT_SUBTYPE = 0x1033, + + SFC_CALC_SIGNAL_MAX = 0x1040, + SFC_CALC_NORM_SIGNAL_MAX = 0x1041, + SFC_CALC_MAX_ALL_CHANNELS = 0x1042, + SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, + SFC_GET_SIGNAL_MAX = 0x1044, + SFC_GET_MAX_ALL_CHANNELS = 0x1045, + + SFC_SET_ADD_PEAK_CHUNK = 0x1050, + SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, + + SFC_UPDATE_HEADER_NOW = 0x1060, + SFC_SET_UPDATE_HEADER_AUTO = 0x1061, + + SFC_FILE_TRUNCATE = 0x1080, + + SFC_SET_RAW_START_OFFSET = 0x1090, + + SFC_SET_DITHER_ON_WRITE = 0x10A0, + SFC_SET_DITHER_ON_READ = 0x10A1, + + SFC_GET_DITHER_INFO_COUNT = 0x10A2, + SFC_GET_DITHER_INFO = 0x10A3, + + SFC_GET_EMBED_FILE_INFO = 0x10B0, + + SFC_SET_CLIPPING = 0x10C0, + SFC_GET_CLIPPING = 0x10C1, + + SFC_GET_INSTRUMENT = 0x10D0, + SFC_SET_INSTRUMENT = 0x10D1, + + SFC_GET_LOOP_INFO = 0x10E0, + + SFC_GET_BROADCAST_INFO = 0x10F0, + SFC_SET_BROADCAST_INFO = 0x10F1, + + SFC_GET_CHANNEL_MAP_INFO = 0x1100, + SFC_SET_CHANNEL_MAP_INFO = 0x1101, + + SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, + + /* Support for Wavex Ambisonics Format */ + SFC_WAVEX_SET_AMBISONIC = 0x1200, + SFC_WAVEX_GET_AMBISONIC = 0x1201, + + SFC_SET_VBR_ENCODING_QUALITY = 0x1300, + + /* Following commands for testing only. */ + SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, + + /* + ** SFC_SET_ADD_* values are deprecated and will disappear at some + ** time in the future. They are guaranteed to be here up to and + ** including version 1.0.8 to avoid breakage of existng software. + ** They currently do nothing and will continue to do nothing. + */ + SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, + SFC_SET_ADD_DITHER_ON_READ = 0x1071 +} ; + + +/* +** String types that can be set and read from files. Not all file types +** support this and even the file types which support one, may not support +** all string types. +*/ + +enum +{ SF_STR_TITLE = 0x01, + SF_STR_COPYRIGHT = 0x02, + SF_STR_SOFTWARE = 0x03, + SF_STR_ARTIST = 0x04, + SF_STR_COMMENT = 0x05, + SF_STR_DATE = 0x06, + SF_STR_ALBUM = 0x07, + SF_STR_LICENSE = 0x08, + SF_STR_TRACKNUMBER = 0x09, + SF_STR_GENRE = 0x10 +} ; + +/* +** Use the following as the start and end index when doing metadata +** transcoding. +*/ + +#define SF_STR_FIRST SF_STR_TITLE +#define SF_STR_LAST SF_STR_GENRE + +enum +{ /* True and false */ + SF_FALSE = 0, + SF_TRUE = 1, + + /* Modes for opening files. */ + SFM_READ = 0x10, + SFM_WRITE = 0x20, + SFM_RDWR = 0x30, + + SF_AMBISONIC_NONE = 0x40, + SF_AMBISONIC_B_FORMAT = 0x41 +} ; + +/* Public error values. These are guaranteed to remain unchanged for the duration +** of the library major version number. +** There are also a large number of private error numbers which are internal to +** the library which can change at any time. +*/ + +enum +{ SF_ERR_NO_ERROR = 0, + SF_ERR_UNRECOGNISED_FORMAT = 1, + SF_ERR_SYSTEM = 2, + SF_ERR_MALFORMED_FILE = 3, + SF_ERR_UNSUPPORTED_ENCODING = 4 +} ; + + +/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). +*/ + +enum +{ SF_CHANNEL_MAP_INVALID = 0, + SF_CHANNEL_MAP_MONO = 1, + SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ + SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ + SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ + SF_CHANNEL_MAP_FRONT_LEFT, + SF_CHANNEL_MAP_FRONT_RIGHT, + SF_CHANNEL_MAP_FRONT_CENTER, + SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ + SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ + SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ + SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ + SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ + SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ + SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ + SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ + SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ + SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ + SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ + SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ + SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ + SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ + SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ + + SF_CHANNEL_MAP_AMBISONIC_B_W, + SF_CHANNEL_MAP_AMBISONIC_B_X, + SF_CHANNEL_MAP_AMBISONIC_B_Y, + SF_CHANNEL_MAP_AMBISONIC_B_Z, + + SF_CHANNEL_MAP_MAX +} ; + + +/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ + +typedef struct SNDFILE_tag SNDFILE ; + +/* The following typedef is system specific and is defined when libsndfile is +** compiled. sf_count_t will be a 64 bit value when the underlying OS allows +** 64 bit file offsets. +** On windows, we need to allow the same header file to be compiler by both GCC +** and the Microsoft compiler. +*/ + +#if (defined (_MSCVER) || defined (_MSC_VER)) +typedef __int64 sf_count_t ; +#define SF_COUNT_MAX 0x7fffffffffffffffi64 +#else +typedef int64_t sf_count_t ; +#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL +#endif + + +/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. +** On write, the SF_INFO structure is filled in by the user and passed into +** sf_open (). +*/ + +struct SF_INFO +{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ + int samplerate ; + int channels ; + int format ; + int sections ; + int seekable ; +} ; + +typedef struct SF_INFO SF_INFO ; + +/* The SF_FORMAT_INFO struct is used to retrieve information about the sound +** file formats libsndfile supports using the sf_command () interface. +** +** Using this interface will allow applications to support new file formats +** and encoding types when libsndfile is upgraded, without requiring +** re-compilation of the application. +** +** Please consult the libsndfile documentation (particularly the information +** on the sf_command () interface) for examples of its use. +*/ + +typedef struct +{ int format ; + const char *name ; + const char *extension ; +} SF_FORMAT_INFO ; + +/* +** Enums and typedefs for adding dither on read and write. +** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE +** and SFC_SET_DITHER_ON_READ. +*/ + +enum +{ SFD_DEFAULT_LEVEL = 0, + SFD_CUSTOM_LEVEL = 0x40000000, + + SFD_NO_DITHER = 500, + SFD_WHITE = 501, + SFD_TRIANGULAR_PDF = 502 +} ; + +typedef struct +{ int type ; + double level ; + const char *name ; +} SF_DITHER_INFO ; + +/* Struct used to retrieve information about a file embedded within a +** larger file. See SFC_GET_EMBED_FILE_INFO. +*/ + +typedef struct +{ sf_count_t offset ; + sf_count_t length ; +} SF_EMBED_FILE_INFO ; + +/* +** Structs used to retrieve music sample information from a file. +*/ + +enum +{ /* + ** The loop mode field in SF_INSTRUMENT will be one of the following. + */ + SF_LOOP_NONE = 800, + SF_LOOP_FORWARD, + SF_LOOP_BACKWARD, + SF_LOOP_ALTERNATING +} ; + +typedef struct +{ int gain ; + char basenote, detune ; + char velocity_lo, velocity_hi ; + char key_lo, key_hi ; + int loop_count ; + + struct + { int mode ; + unsigned int start ; + unsigned int end ; + unsigned int count ; + } loops [16] ; /* make variable in a sensible way */ +} SF_INSTRUMENT ; + + + +/* Struct used to retrieve loop information from a file.*/ +typedef struct +{ + short time_sig_num ; /* any positive integer > 0 */ + short time_sig_den ; /* any positive power of 2 > 0 */ + int loop_mode ; /* see SF_LOOP enum */ + + int num_beats ; /* this is NOT the amount of quarter notes !!!*/ + /* a full bar of 4/4 is 4 beats */ + /* a full bar of 7/8 is 7 beats */ + + float bpm ; /* suggestion, as it can be calculated using other fields:*/ + /* file's lenght, file's sampleRate and our time_sig_den*/ + /* -> bpms are always the amount of _quarter notes_ per minute */ + + int root_key ; /* MIDI note, or -1 for None */ + int future [6] ; +} SF_LOOP_INFO ; + + +/* Struct used to retrieve broadcast (EBU) information from a file. +** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. +*/ +#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ + struct \ + { char description [256] ; \ + char originator [32] ; \ + char originator_reference [32] ; \ + char origination_date [10] ; \ + char origination_time [8] ; \ + unsigned int time_reference_low ; \ + unsigned int time_reference_high ; \ + short version ; \ + char umid [64] ; \ + char reserved [190] ; \ + unsigned int coding_history_size ; \ + char coding_history [coding_hist_size] ; \ + } + +/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ +typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; + + +/* Virtual I/O functionality. */ + +typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; +typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; +typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_tell) (void *user_data) ; + +struct SF_VIRTUAL_IO +{ sf_vio_get_filelen get_filelen ; + sf_vio_seek seek ; + sf_vio_read read ; + sf_vio_write write ; + sf_vio_tell tell ; +} ; + +typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; + + +/* Open the specified file for read, write or both. On error, this will +** return a NULL pointer. To find the error number, pass a NULL SNDFILE +** to sf_strerror (). +** All calls to sf_open() should be matched with a call to sf_close(). +*/ + +SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; + + +/* Use the existing file descriptor to create a SNDFILE object. If close_desc +** is TRUE, the file descriptor will be closed when sf_close() is called. If +** it is FALSE, the descritor will not be closed. +** When passed a descriptor like this, the library will assume that the start +** of file header is at the current file offset. This allows sound files within +** larger container files to be read and/or written. +** On error, this will return a NULL pointer. To find the error number, pass a +** NULL SNDFILE to sf_strerror (). +** All calls to sf_open_fd() should be matched with a call to sf_close(). + +*/ + +SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; + +SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; + + +/* sf_error () returns a error number which can be translated to a text +** string using sf_error_number(). +*/ + +int sf_error (SNDFILE *sndfile) ; + + +/* sf_strerror () returns to the caller a pointer to the current error message for +** the given SNDFILE. +*/ + +const char* sf_strerror (SNDFILE *sndfile) ; + + +/* sf_error_number () allows the retrieval of the error string for each internal +** error number. +** +*/ + +const char* sf_error_number (int errnum) ; + + +/* The following two error functions are deprecated but they will remain in the +** library for the forseeable future. The function sf_strerror() should be used +** in their place. +*/ + +int sf_perror (SNDFILE *sndfile) ; +int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; + + +/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ + +int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; + + +/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ + +int sf_format_check (const SF_INFO *info) ; + + +/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses +** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as +** stdio.h function fseek (). +** An offset of zero with whence set to SEEK_SET will position the +** read / write pointer to the first data sample. +** On success sf_seek returns the current position in (multi-channel) +** samples from the start of the file. +** Please see the libsndfile documentation for moving the read pointer +** separately from the write pointer on files open in mode SFM_RDWR. +** On error all of these functions return -1. +*/ + +sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; + + +/* Functions for retrieving and setting string data within sound files. +** Not all file types support this features; AIFF and WAV do. For both +** functions, the str_type parameter must be one of the SF_STR_* values +** defined above. +** On error, sf_set_string() returns non-zero while sf_get_string() +** returns NULL. +*/ + +int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; + +const char* sf_get_string (SNDFILE *sndfile, int str_type) ; + + +/* Return the library version string. */ + +const char * sf_version_string (void) ; + + +/* Functions for reading/writing the waveform data of a sound file. +*/ + +sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; +sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; + + +/* Functions for reading and writing the data chunk in terms of frames. +** The number of items actually read/written = frames * number of channels. +** sf_xxxx_raw read/writes the raw data bytes from/to the file +** sf_xxxx_short passes data in the native short format +** sf_xxxx_int passes data in the native int format +** sf_xxxx_float passes data in the native float format +** sf_xxxx_double passes data in the native double format +** All of these read/write function return number of frames read/written. +*/ + +sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; +sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; +sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; +sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; +sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; + + +/* Functions for reading and writing the data chunk in terms of items. +** Otherwise similar to above. +** All of these read/write function return number of items read/written. +*/ + +sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; +sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; + +sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; +sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; + +sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; +sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; + +sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; +sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; + + +/* Close the SNDFILE and clean up all memory allocations associated with this +** file. +** Returns 0 on success, or an error number. +*/ + +int sf_close (SNDFILE *sndfile) ; + + +/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file +** to force the writing of data to disk. If the file is opened SFM_READ +** no action is taken. +*/ + +void sf_write_sync (SNDFILE *sndfile) ; + + + +/* The function sf_wchar_open() is Windows Only! +** Open a file passing in a Windows Unicode filename. Otherwise, this is +** the same as sf_open(). +** +** In order for this to work, you need to do the following: +** +** #include <windows.h> +** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +** #including <sndfile.h> +*/ + +#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) +SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; +#endif + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* SNDFILE_H */ + diff --git a/interpreter/lib/src/libsndfile-ocaml/sndfile_stub.c b/interpreter/lib/src/libsndfile-ocaml/sndfile_stub.c index ccf2b16..dfb1bc5 100644 --- a/interpreter/lib/src/libsndfile-ocaml/sndfile_stub.c +++ b/interpreter/lib/src/libsndfile-ocaml/sndfile_stub.c @@ -30,7 +30,7 @@ #include <stdlib.h> #include <string.h> -#include <sndfile.h> +#include "sndfile.h" #define CAML_SNDFILE_VERSION "v0.1" -- 2.20.1